Java中的short和char自动拆箱

时间:2018-10-28 12:10:26

标签: java unboxing

   HashSet charSet = new HashSet();
   for (char i = 0; i < 100; i++) {
      charSet.add(i);
      charSet.remove(i - 1);
    }
    System.out.println(charSet.size());

    HashSet intSet = new HashSet();
    for (int i = 0; i < 100; i++) {
        intSet.add(i);
        intSet.remove(i - 1);
    }
    System.out.println(intSet.size());

输出分别为100和1。

我刚刚意识到short和char在Java中不会自动取消装箱。设计师为什么不认为这样做很重要?

2 个答案:

答案 0 :(得分:4)

这实际上与装箱或拆箱无关。

在对char进行算术运算时,根据JLS §5.6.2,它会转换为int

  
      
  1. 使用野生原语转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:      
        
    • 如果其中一个操作数的类型为double,则另一个将转换为double
    •   
    • 否则,如果其中一个操作数的类型为float,则另一个将被转换   到float
    •   
    • 否则,如果其中一个操作数的类型为long,则另一个将被转换   到long
    •   
    • 否则,两个操作数都将转换为int类型。
    •   
  2.   

因此,i - 1不是char,而是int。而且,由于您的Integer中没有charSet(只有Character个),因此没有要删除的内容。如果将i - 1强制转换为char,将会获得预期的结果。

答案 1 :(得分:0)

  

我刚刚意识到short和char在Java中不会自动取消装箱。设计师为什么不认为这样做很重要?

无论得出什么结论,这都是不正确的。

shortchar都可以在JLS Sec 5.1.8, Unboxing conversion中找到。

很容易编写代码来证明charshort都经过自动装箱和自动拆箱:

Short ss = (short) 0;  // Autoboxing short to Short
short s = ss;          // Auto unboxing Short to short

Character cc = '\0';   // Autoboxing char to Character
char c = cc;           // Auto unboxing Character to char

Ideone demo