2012-02-23 44 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;