我们有一些单元测试,其编译并在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方法

PS

IMHO是蚀编译器的一个错误

其他提示

我把它通过添加<?,?>成功建立在MatcherSubMatcher.with

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

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

检查其中的JRE或JDK您正在与Eclipse和终端编译。也许这可能是版本的问题。

适用于我:

$ java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-****-2009_07_23_10_21-b00)
OpenJDK 64-Bit Server VM (build 16.0-b06, mixed mode)
$ javac -XDrawDiagnostics Test.java 
$

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top