java - Oracle java 教程 - 有关字符自动装箱 java 注释的可能错误

标签 java autoboxing

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

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

Pair < Integer, Character > p = new Pair<>(8, 'a');

Note that the Java compiler autoboxes 8 to Integer.valueOf(8) and 'a' to Character('a'):

Pair < Integer, Character > p = new Pair<>(Integer.valueOf(8), new Character('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("=============");
}

}

输出为:

通用方法用法: 值:aa 真的 第一个 == 第二个为真

第一个 == 第二个为真

常规方法用法: 值:aa 真的 第一个 == 第二个为真

第一个 == 第二个为真

通用类用法: 值:aa 真的 第一个 == 第二个为真

第一个 == 第二个为真

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

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

谢谢。

埃利亚胡

最佳答案

是的,自动装箱是通过 valueOf 在任何地方完成的,以利用任何缓存。例如使用字符:

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

这是一个文档疏忽。

关于java - Oracle java 教程 - 有关字符自动装箱 java 注释的可能错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51634863/

相关文章:

java - NullPointerException 通过 Java 三元运算符的自动装箱行为

Java 自动装箱/拆箱怪异

Java:原始数据类型数组不自动装箱

java - long.Class 和 Long.TYPE 的区别

java - 是否可以使用单个属性文件来管理并发写入?

java - 将 JSON 对象名称-值对反序列化为数组的元素

java - 在 2 个输入文件上使用方法 - 第二个是多次打印 - Java

java - 使用优先级堆/比较器时输出不规则

java - Java版本中ArrayList的修改为什么?

java - java 中的自动装箱与 th++,-- 运算符