在Java编程语言中,widen和boxing不起作用,但它如何在以下示例中起作用?
final short myshort = 10;
Integer iRef5 = myshort;
为什么这样做?这是不是加宽了然后框?
但如果我写下面的代码:
final int myint = 10;
Long myLONG = myint;
为什么它不起作用?
答案 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;
另见