考虑上面的代码示例。
为什么编译器在for-each-loops中抱怨“不兼容的类型”并说:
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()) {
}
}
}
答案 0 :(得分:4)
没时间找到相应的JLS部分,但很简单:如果使用类型参数声明一个类,然后在没有它的情况下使用它,编译器将删除该类的所有泛型声明。即
public class A<T> {
Map<String,Field> m;
}
变为
public class A {
Map m;
}
修复很明显:使用通用参数实例化A或删除T.
答案 1 :(得分:0)
内场B.a必须具体化。 试试
class B {
A<Object> a;