Oracle java教程 - 关于字符自动装箱java注释的可能错误[重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

我是JAVA的新手,目前正在学习Oracle教程泛型部分。我认为那里有一个错误,我想确保我没错。我将非常感谢您的反馈。

我在https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html看到了以下解释

配对<整数,字符> p =新配对<>(8,'a');

请注意,Java编译器将8自动装箱到Integer.valueOf(8),将'a'自动装箱到角色('a'):

配对<整数,字符> p =新配对<>(Integer.valueOf(8),新字符('a'));

我认为这是一个错误,'a'实际上是自动装入Character.valueOf('a')。

我编写了以下程序来检查它。因为我认为也许泛型有特殊拳击,我尝试了泛型方法,常规方法和泛型类:

class TestCharacter<T>{
public <T> void check( T first, T second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
}

public class TestAutoBoxingIssue{

public static <T> void check1( T first, T second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
public static void check2( Character first, Character second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
public static void main(String[] args){
    char first = 'a';
    char second = 'a';
    System.out.println("generic method usage: ");
    check1( first, second );
    System.out.println("=============");

    System.out.println("regular method usage: ");
    check2( first, second );
    System.out.println("=============");

    TestCharacter<Character> t = new TestCharacter<>();
    System.out.println("generic class usage: ");
    t.check(first, second );
    System.out.println("=============");
}

}

输出是:

泛型方法用法:值:a a true first == second为true

first == second is true

常规方法用法:值:a a true first == second为true

first == second is true

泛型类用法:值:a a true first == second为true

first == second is true

所以,我认为这表明'a'被自动装箱到Character.valueOf。

我错过了什么吗?这是检查它的正确方法吗?

谢谢。

埃利亚胡

java autoboxing
1个回答
3
投票

是的,自动装箱是用valueOf到处完成的,以利用任何缓存。例如,使用Character

public static Character valueOf(char c) {
    if (c <= 127) { // must cache
        return CharacterCache.cache[(int)c];
    }
    return new Character(c);
}

这是一个文件疏忽。

© www.soinside.com 2019 - 2024. All rights reserved.