java - 为什么 Eclipse 会编译它,而 javac 不会?

标签 java compiler-construction jls

我们有一些单元测试可以在 Eclipse 3.4 中正常编译和运行,但是当我们尝试使用 javac 编译它们时,它会失败。我已经设法将代码缩减为一些小而独立的代码,因此它没有外部依赖性。代码本身没有多大意义,因为它完全脱离了上下文,但这并不重要——我只需要找出为什么 javac 不喜欢这样:

public class Test {

    public void test() {
        matchOn(someMatcher().with(anotherMatcher()));
    }

    void matchOn(SubMatcher matcher) {}

    SubMatcher someMatcher() {
        return new SubMatcher();
    }

    Matcher anotherMatcher() {
        return null;
    }
}

interface Matcher <U, T> {}

class BaseMatcher implements Matcher {
    public BaseMatcher with(Matcher<?,?> matcher) {
        return this;
    }
}

class SubMatcher extends BaseMatcher {
    @Override
    public SubMatcher with(Matcher matcher) {
        return this;
    }
}

我已经尝试使用 JDK 1.5.0_101.6.0_13,结果相同:

Test.java:6: matchOn(test.SubMatcher) in test.Test cannot be applied to (test.BaseMatcher)
                matchOn(someMatcher().with(anotherMatcher()));
                ^
1 error

我认为这是完全有效的 Java。 SubMatcher.with() 方法返回的类型比BaseMatcher.with() 更具体,但编译器似乎认为返回类型是BaseMatcher。但是,Eclipse 编译器可能错误地允许了一些不应该允许的事情。

有什么想法吗?

最佳答案

在 BaseMatcher 中你需要指定类型参数:

public SubMatcher with(Matcher<?, ?> matcher) {

为了让javac匹配你的with方法

附言

恕我直言,这是eclipse编译器的一个bug

关于java - 为什么 Eclipse 会编译它,而 javac 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176799/

相关文章:

java - 为 Google Cloud Storage 对象生成公共(public)链接

c# - 分析可执行文件的工具

eclipse - 如何禁用Eclipse编译器

java - Alt+Tab 使用 Java 机器人

java - 如何选择过去一个月的第一个星期一之前的星期日

java - 围绕 superfirst 工作

java - Java8 中的模棱两可的重载——ECJ 还是 javac 正确?

Java SE 11 - Java 语言规范中类型转换的新案例

java - 如何从非模拟方法中获取结果?

java - String类以及Java对其的依赖