Java 1.7から1.8へのコードベースの移行中に、「メソッド...は引数に適用できませんいくつかのコードの場所では、すべてジェネリックスの使用法と同じパターンに従います。Java 8のジェネリックメソッドは、Eclipseの引数には適用されません
Windows 7
でほとんどEclipse Mars
(4.5.2)を使用していますが、Neon
(4.6)でも動作を確認できました。 Javac
およびecj
の1.7準拠レベルでは、エラーなしにコードをコンパイルできます。ここで
は、最小完全、かつ検証可能な例である:今doSomething
方法でコメントアウト行を切り替え
public class ComplexInterfaceTest {
public static class Foo {}
public interface Bar {
void print();
}
public static class SubFooBar extends Foo implements Bar {
public void print() {
System.out.println(this.getClass().getSimpleName());
}
}
public static class FooBar<T extends Foo & Bar> {
public static <T extends Foo & Bar> FooBar<T> makeFooBar() {
return new FooBar<>();
}
public void create(T value) {
value.print();
return;
}
}
public static class Base<T extends Foo> {}
public static class Subclass extends Base<SubFooBar> {
public void doSomething(SubFooBar value) {
// FooBar.<SubFooBar>makeFooBar().create(value);
FooBar.makeFooBar().create(value);
}
}
public static void main(String[] args) {
new Subclass().doSomething(new SubFooBar());
}
}
は、コンパイルするコードになりますので、我々は回避策を持っています。それでもエラーメッセージがクラスSubFooBar
がFoo
を拡張するように、右ではないようで、それが<T extends Foo & Bar> FooBar<T> makeFooBar()
に必要とされる<T extends Foo & Bar>
の契約を、満たし、そう実際にT
はIMO SubFooBar
にバインドする必要がありますので、Bar
を実装しています。
ecj
バグかもしれないと思わせる
Differences in type inference JDK8 javac/Eclipse Luna?
Type Inference Compiler Error In Eclipse with Java8 but not with Java7
を。このコースでは私もEclipse Bugzilla
に見えたが、同等の何かを見つけることができませんでした、私はこれらを見ました:
- 430686が固定検証される - 鉱山はスカラー型に関係しています
- 440019ではない - 私のいない
- 492838、448793は、ワイルドカードでなければならない - 鉱山はない
今Eclipse Bugzilla
議論は、私は必ずしも従うことができますecj
の内部動作に関する詳細に満ちています。しかし、私が理解しているのは、Eclipse
コンパイラがを厳密に守らなければならず、javac
(それが間違っていた場合)ではないので、必ずしもecj
のバグである必要はありません。 ecj
バグでなければ、コードをコンパイルするにはjavac
のバグだったはずです。
私が関心を持っているのは、自分のコードスニペットの型推論プロセスを分析できる人たちです。コードがコンパイルされているか、コーディングにエラーがありましたか?欠陥が497905が(ステファンハーマンは受け入れ答え以下の彼のコメント内のリンクを掲載している)ID番号を持っており、現在は次のとおりです。私は、EclipseのBugzilla
に私のレポートの結果を掲示することを約束したよう
EDIT
v4.7をターゲットとしています。
方法public void doSomething(SubFooBar value) {
FooBar.makeFooBar().create(value);
}
で
Eclipse Bugzillaに関するバグレポートを投稿しました。回答を投稿します。 –