2012-02-23 46 views
2

考慮上面的代碼示例。爲每個迴路鑄造

爲什麼編譯器抱怨中的for-each循環「不兼容的類型」,並說:

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 2012-02-23 15:22:12

+1

向我們展示真實的代碼。你在真正的foreach中迭代的對象的類型是什麼? – penartur 2012-02-23 15:22:47

+9

爲了弄清楚爲什麼你的代碼不起作用,我們真的需要看到不起作用的代碼,而不是一些近似。 – NPE 2012-02-23 15:22:48

回答

4

沒有時間去尋找相應的JLS的一部分,但其實很簡單:如果你聲明一個類與一類參數,然後使用它,沒有它,編譯器去除類的所有通用的聲明。即

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

變得

public class A { 
    Map m; 
} 

修復的方法是明顯的:實例化一個具有通用參數或移除T.

+1

這對我來說是新的。謝謝。 – PeterMmm 2012-02-23 16:08:36

0

內部場B.a必須具體化。 嘗試

class B { 

    A<Object> a;