テンプレートクラスに関連していないコレクションがそのタイプを削除するのはなぜですか?ここでは一例である:(。申し訳ありませんが、それはので、私は混乱していエラーがコンパイルされません)一般的なネジアップ関連以外のコレクション
package test;
import java.util.ArrayList;
import java.util.List;
public class TemplateTest {
public static class A { }
public static class B<T extends Comparable> {
List<A> aList = new ArrayList<A>();
public List<A> getAList() {
return aList;
}
public int compare(T t, T t1) {
return t.compareTo(t1);
}
}
public static void main(String[] args) {
B b = new B();
for (A a : b.getAList()) { //THIS DOES NOT WORK
}
List<A> aList = b.getAList(); //THIS WORKS
for (A a : aList) {
}
}
}
このコードはコンパイル時にエラーがスローされます:
test/TemplateTest.java:24: incompatible types
found : java.lang.Object
required: test.TemplateTest.A
for (A a : b.getAList()) {
私はテンプレートを指定した場合B
のようにB<String>
、またはテンプレートをBから完全に削除した場合はすべて正常です。
何が起こっているのですか?
編集:それはC++であるような人々は、私は
前ナンセンスについては申し訳ありませんバグに関連している。名誉! –
あなたの質問に厳密には関係しませんが、Javaではtypeパラメータを指定しない*は*一般にプログラミングエラーとみなされます。生の型を使用することは、下位互換性のための譲歩としてのみコンパイルします。 – Affe
私はコンパイラのバグも呼び出します。拡張されたforループで使用される右側の式の型が特殊な方法で決定され(特殊な配列を必要とするので驚くことではない)、生の型が含まれている場合はこれが中断されるようです。 (私は生の型をどこかで見ると、式全体が型が消去されていることを前提としています)。 – millimoose