ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-10-12 03:01:38  阅读:228  来源: 互联网

标签:java autoboxing


这个问题已经在这里有了答案:            >            Does autoboxing call valueOf()?                                    4个
我是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("=============");
}

}

输出为:

通用方法用法:
值:一个
真正
第一==第二是正确的

第一==第二是正确的

常规方法用法:
值:一个
真正
第一==第二是正确的

第一==第二是正确的

通用类用法:
值:一个
真正
第一==第二是正确的

第一==第二是正确的

因此,我认为这表明’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,autoboxing
来源: https://codeday.me/bug/20191012/1897426.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有