2012-02-23 11 views
2

上記のコード例を検討してください。for-each-loopでのキャスト

コンパイラがために、各ループで「互換性のない型」文句を言うと言う理由:

B.java:10: incompatible types 
found : java.lang.Object 
required: java.lang.String 
      for (String k : a.m.keySet()) { 

私は型パラメータを取り除く場合は、すべてが正常にコンパイルされます。

public class A<T> { 

    Map<String,Field> m; 

    void foo() { 
     new B(this).foo(); 
    } 
} 

class B { 

    A a; 

    B(A a) { 
     this.a = a; 
    } 

    void foo() {   
     for (String k : a.m.keySet()) { 
     } 
    } 
} 
+10

あなたの本当のクラスは、例とまったく同じですか?あなたの 'Map'は型パラメータを持っていますか、それとも生の' Map'ですか?型パラメータがない場合、 'keySet'はキー型のコレクションではなく' Object'のコレクションを返します。 – Jesper

+1

実際のコードを教えてください。実際のforeachで反復処理するオブジェクトのタイプは何ですか? – penartur

+9

あなたのコードがうまくいかない理由を理解するために、実際には動作しないコードを見なければなりません。 – NPE

答えて

4

対応JLS部分を見つけるための時間がないが、それは簡単です:あなたは型パラメータを持つクラスを宣言し、それなしでそれを使用する場合、コンパイラはクラスのすべての一般的な宣言を削除します。私。

public class A<T> { 
    Map<String,Field> m; 
} 

修正は明白である

public class A { 
    Map m; 
} 

次のようになります。一般的なパラメータを指定してインスタンス化AまたはT.

+1

それは私には新しいものでした。ありがとう。 – PeterMmm

0

B.aが具体化しなければならない内部フィールドを削除します。 試してみてください

class B { 

    A<Object> a;