使用Java扩展和装箱

时间:2011-12-22 08:43:21

标签: java

在Java编程语言中,widen和boxing不起作用,但它如何在以下示例中起作用?

final short myshort = 10;
Integer iRef5 = myshort; 

为什么这样做?这是不是加宽了然后框?

但如果我写下面的代码:

final int myint = 10;
Long myLONG = myint;

为什么它不起作用?

7 个答案:

答案 0 :(得分:2)

按照别人的说法,我可以确认我可以用Eclipse编译器编译你的第一个例子,但不是第二个。使用javac编译器,两者都不编译,如Vlad

所述
  

这似乎是两个编译器中的错误!让我们咨询JLS,找出哪一个是正确的: - )

答案 1 :(得分:1)

两者都不能正常工作(在Linux上使用Sun / Oracle的javac 1.6.0_26)。 另请参阅here

b.java:4: incompatible types
found   : short
required: java.lang.Integer
        Integer iRef5 = myshort; 
                        ^
b.java:7: incompatible types
found   : int
required: java.lang.Long
        Long myLONG = myint;
                      ^
2 errors

答案 2 :(得分:1)

你可以加宽或装箱,但你不能两者都做。

你可以做到

final int myint = 10;
Long myLONG = (long) myint;

答案 3 :(得分:1)

使用java 7这两个示例都不起作用。你会得到以下异常:

Type mismatch: cannot convert from short to Integer
Type mismatch: cannot convert from int to Long

因为问题不是因为拳击而是因为转换。

答案 4 :(得分:1)

让我们仔细研究一下你要做的事情:

final short myshort = 10;
Integer iRef5 = myshort; 

编译器将首先尝试将short缩短为一个对象,以便它可以执行赋值(它不能直接扩展,因为它处理不同的类型:对象和基元)。

简而言之,这相当于:

final short myshort = 10;
final Short box = new Short(myshort);  // boxing: so that objects are assignable.
Integer iRef5 = box;  // widening: this fails as Integer is not a superclass of Short

同样的推理可以应用于你的第二个例子(也失败了),可见here。如果您的编译器没有在第一个上抱怨,那么编译器可能存在错误,因为这是JLS中定义的。请参阅JLS here中的完整转换/促销规则。

答案 5 :(得分:0)

这些是适用于Java中表达式的推广规则

所有字节值都会提升为 int

如果一个操作数,整个表达式将提升为 long

如果一个操作数是 float ,则整个表达式将提升为 float

如果一个操作数为 double ,则整个表达式将提升为 double

因此将短值提升为int。这并没有扩大。 “将子类型转换为其超类型之一称为加宽”


答案 6 :(得分:0)

您可以box然后wide但不能widen然后box

所以

final short myshort = 10;
Integer iRef5 = myshort; 

相当于

final short myshort = 10;
Integer iRef5 = 10; 

完全有效

但是

Long myLONG = 10;//this won't compile , 

但请尝试使用10L,这样它就会打包然后你也可以让它成为对象,即Object o = 10L;


另见