Oracle java 教程 - 关于字符自动装箱 java 注释的可能错误
Oracle java tutorial - possible error regarding Character autoboxing java comment
我是 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:
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("=============");
}
}
输出为:
通用方法用法:
价值观:一个
真的
第一个 == 第二个为真
第一个==第二个是真的
常规方法用法:
价值观:一个
真的
第一个 == 第二个为真
第一个==第二个是真的
通用class用法:
价值观:一个
真的
第一个 == 第二个为真
第一个==第二个是真的
所以,我认为这表明 'a' 被自动装箱为 Character.valueOf。
我错过了什么吗?这是检查它的正确方法吗?
谢谢。
以利亚胡
是的,自动装箱是通过 valueOf
在任何地方完成的,以利用任何缓存。例如 Character
:
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
这是文档疏忽。
我是 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:
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("=============");
}
}
输出为:
通用方法用法: 价值观:一个 真的 第一个 == 第二个为真
第一个==第二个是真的
常规方法用法: 价值观:一个 真的 第一个 == 第二个为真
第一个==第二个是真的
通用class用法: 价值观:一个 真的 第一个 == 第二个为真
第一个==第二个是真的
所以,我认为这表明 'a' 被自动装箱为 Character.valueOf。
我错过了什么吗?这是检查它的正确方法吗?
谢谢。
以利亚胡
是的,自动装箱是通过 valueOf
在任何地方完成的,以利用任何缓存。例如 Character
:
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
这是文档疏忽。