Eclipse はこれをコンパイルするのに、javac はコンパイルしないのはなぜですか?
-
19-09-2019 - |
質問
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
方法と一致することを可能にするために、
PS
私見であるEclipseのコンパイラのバグ
他のヒント
追加することで正常にビルドできました <?,?>
に Matcher
で SubMatcher.with
:
class SubMatcher extends BaseMatcher {
@Override
public SubMatcher with(Matcher<?,?> matcher) {
return this;
}
}
これがないと、メソッドのシグネチャはベースとは異なります。バグでもあるのかな @Override
チェックするとこれに気付かない。
あなたは、Eclipseと端末の両方で使用してコンパイルされているJREまたはJDKを確認してください。多分それはバージョンの問題かもしれません。
私にとっては作品ます:
$ 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 $
私は漠然と、このようなバグ報告を覚えていますが、今のあなたにそれへのリンクを与えることはできません。