ジェネリックで作業するときに奇妙な動作が検出されました。このクラスFoo<T>
で生の型のメンバで一般的な型が失われた
、strings
メンバーはT
とは何の関係もありません:コンパイルエラーは、「互換性のない型である
package test;
public class Main {
public static void main() {
Foo<Integer> intFoo = new Foo<>();
Integer i = intFoo.getSome();
String s1 = intFoo.strings.get(0);
Foo rawFoo = new Foo();
Object o = rawFoo.getSome();
String s2 = rawFoo.strings.get(0); // Compilation error on this line
}
}
:
package test;
import java.util.ArrayList;
public class Foo<T> {
ArrayList<String> strings;
T getSome() {
return null;
}
}
クラスをメインに使用されています。必須:文字列が見つかりました:オブジェクト "。
生タイプがFoo
の場合、ArrayList
には、String
タイプの引数が忘れられているようです。 rawFoo
生なので
私のJavaのバージョンは、その非静的メンバーはまた、生となり、簡単に言えば1.7.0_21
これは完全に正常です。生の型は完全に生のままです(全メンバ)。同様の質問を検索してください。 –
未加工の種類は下位互換性を保つために用意されています。 [生の型に関するJavaチュートリアル](http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html)から: "生の型を使用する場合、基本的にはジェネリックの前の動作になります"。 Fooの生の型は、一般的なメンバ(Tに依存しない場合でも)を持っていれば下位互換性はありません。 –