代码之家  ›  专栏  ›  技术社区  ›  Eliyahu Machluf

Oracle Java教程——关于字符自动装箱Java注释(复制)的可能错误

  •  2
  • Eliyahu Machluf  · 技术社区  · 7 年前

    我是JAVA新手,目前正在学习Oracle教程泛型部分。我想这是个错误,我想确定我没有错。谢谢你的反馈。

    我看到下面的解释 https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html

    Pair<Integer,Character>p=新对<gt;(8,'a');

    注意,Java编译器将autoboxes 8设置为Integer.valueOf(8)和 “a”到字符(“a”) :

    Pair<Integer,Character>p=新对<gt;(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 真的 第一=第二为真

    第一=第二为真

    泛型类用法: 值:a 真的 第一=第二为真

    第一=第二为真

    所以,我认为这说明了“a”是Character.valueOf的自动框。

    我遗漏了什么吗?这是检查的正确方法吗?

    谢谢。

    埃利亚胡

    1 回复  |  直到 7 年前
        1
  •  3
  •   Kayaman    7 年前

    是的,自动装箱是用 valueOf 任何地方都可以利用任何一个藏匿处。例如 Character :

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

    这是一个文件监督。