为什么这个Java代码在一个Eclipse项目中生成错误而在另一个Eclipse项目中生成错误?

时间:2014-11-11 17:02:19

标签: java eclipse autoboxing type-mismatch

我在名为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环境中出错。

1 个答案:

答案 0 :(得分:0)

事实证明,package cas声明了类型cas.Integer。由于在本地包阴影中声明的名称隐式导入了系统类型,因此在声明中隐式使用了cas.Integer而不是java.lang.Integer,并且错误消息未提供完全限定的类型名称。

这个问题可以通过声明变量java.lang.Integer boxed = primitive或(我个人最喜欢的)添加import java.lang.Integer来解决,因为特别导入的类型会隐藏导入的包类型(分别隐藏隐式导入的系统类型)。或者不声明名为Integer的类。 (虽然在这种情况下有充分的理由。)

这当然是一个愚蠢的错误,但它可能对某人很有启发性(看看错误信息似乎是不可能的)。