我们有一些单元测试可以在 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_10
和 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 编译器可能错误地允许了一些不应该允许的事情。
有什么想法吗?
最佳答案
在 BaseMatcher 中你需要指定类型参数:
public SubMatcher with(Matcher<?, ?> matcher) {
为了让javac匹配你的with
方法
附言
恕我直言,这是eclipse编译器的一个bug
关于java - 为什么 Eclipse 会编译它,而 javac 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176799/