2013-10-08 16 views
9

ジェネリックで作業するときに奇妙な動作が検出されました。このクラス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

+7

これは完全に正常です。生の型は完全に生のままです(全メンバ)。同様の質問を検索してください。 –

+2

未加工の種類は下位互換性を保つために用意されています。 [生の型に関するJavaチュートリアル](http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html)から: "生の型を使用する場合、基本的にはジェネリックの前の動作になります"。 Fooの生の型は、一般的なメンバ(Tに依存しない場合でも)を持っていれば下位互換性はありません。 –

答えて

10

です。

これはJLS §4.8に概説されている:

  • ジェネリック型の名前を取ることによって形成された参照型:

    より正確には、生型はのいずれかであると定義されます付随する型引数リストのない宣言。

  • エレメントタイプが生のタイプである配列タイプ。

  • R.

    のスーパークラス又はスーパーインターフェースから

注最後の弾丸を継承していない生のタイプRの非静的メンバ型。

+0

最後の箇条書きは実際には内部クラス(非静的メンバ*型*)を参照しています。 – Radiodef

関連する問題