我在名为Sandbox.java
的文件中有以下测试类:
package cas;
public final class Sandbox {
public static void main(String[] args) {
int primitive = 42;
Integer boxed = primitive;
}
}
由于自动装箱,这是我期望的。但是,它无法使用错误进行编译:"类型不匹配:无法从int转换为Integer"。为了隔离测试用例,我将文件放在另一个Eclipse项目中,其中代码完全相同,只是package cas;
被package sandbox
替换。在这个项目中,它正常编译。
我正在使用编译器合规性级别1.8,我认为是最新的JDK。因为如果我没记错的话,自动装箱是在1.5中引入的,那么int不应该有任何问题 - >整数转换,或者我认为。
我检查了两个项目的属性,并检查了每个页面的"启用项目特定设置"复选框已禁用。所以两个项目之间应该没有区别。编译,没有?
我不明白为什么这段代码会在Java 1.8环境中出错。
答案 0 :(得分:0)
事实证明,package cas
声明了类型cas.Integer
。由于在本地包阴影中声明的名称隐式导入了系统类型,因此在声明中隐式使用了cas.Integer
而不是java.lang.Integer
,并且错误消息未提供完全限定的类型名称。
这个问题可以通过声明变量java.lang.Integer boxed = primitive
或(我个人最喜欢的)添加import java.lang.Integer
来解决,因为特别导入的类型会隐藏导入的包类型(分别隐藏隐式导入的系统类型)。或者不声明名为Integer
的类。 (虽然在这种情况下有充分的理由。)
这当然是一个愚蠢的错误,但它可能对某人很有启发性(看看错误信息似乎是不可能的)。