【问题标题】:Why does this Java code generate an error in one Eclipse project but not the other?为什么这段 Java 代码会在一个 Eclipse 项目中产生错误,而在另一个项目中却没有?
【发布时间】:2014-11-11 17:02:19
【问题描述】:

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

【问题讨论】:

    标签: java eclipse autoboxing type-mismatch


    【解决方案1】:

    原来package cas 声明了一个类型cas.Integer。由于在本地包影子中声明的名称隐式导入了系统类型,因此在声明中隐式使用了cas.Integer 而不是java.lang.Integer,并且错误消息没有给出完全限定的类型名称。

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

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

    【讨论】:

    • 我个人认为这个问题不会有太大帮助,部分是因为遇到此类错误的人90% 的时间都不会费心去做另一个项目。
    • 如果使用java.lang.Integer,您可能会发现这一点。
    • @JeroenVannevel 好吧,如果大家一致认为这个问题不会很有帮助,那么它当然可以删除。一方面,我已经编程多年,我发现隐式导入的阴影序列非常有趣。但显然我不能代表其他所有人。
    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2011-07-31
    相关资源
    最近更新 更多