在for-each-loops中进行转换

时间:2012-02-23 15:19:48

标签: java casting

考虑上面的代码示例。

为什么编译器在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()) { 
        }
    }
}

2 个答案:

答案 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;