7

我们有一些在 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_10and 1.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 编译器可能错误地允许了不应该允许的东西。

有任何想法吗?

4

4 回答 4

7

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

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

为了让 javac 匹配你的with方法

附言

imho是eclipse编译器的一个bug

于 2009-07-24T10:21:04.243 回答
6

我通过添加<?,?>Matcherin成功构建了它SubMatcher.with

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

没有这个,方法签名与基础不同。我想知道@Override检查中是否存在没有注意到这一点的错误。

于 2009-07-24T10:23:50.273 回答
0

在 Eclipse 和终端上检查您正在使用哪个 jre 或 jdk 进行编译。可能是版本问题。

于 2009-07-24T10:16:29.947 回答
0

为我工作:

$ java -版本
openjdk 版本“1.7.0-内部”
OpenJDK 运行时环境(构建 1.7.0-internal-****-2009_07_23_10_21-b00)
OpenJDK 64 位服务器 VM(内部版本 16.0-b06,混合模式)
$ javac -XDrawDiagnostics Test.java
$

我依稀记得这样一个错误报告,但现在不能给你一个链接。

于 2009-07-24T10:22:56.003 回答