2012-02-23 3 views
2

Рассмотрим приведенный выше пример кода.Кастинг для каждой петли

Почему компилятор жалуется на «несовместимых типов» в обмен на каждой петле и говорит:

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

Вы уверены, что ваш настоящий класс точно такой же, как в примере? У вашей «Карты» есть параметры типа, или это сырая «Карта»? Если у него нет параметров типа, тогда 'keySet' вернет коллекцию' Object' вместо коллекции типа ключа. – Jesper

+1

Покажите нам реальный код. Каков тип объекта, который вы повторяете в своем реальном foreach? – penartur

+9

Чтобы понять, почему ваш код не работает, нам действительно нужно увидеть код, который не работает, а не какое-то приближение. – NPE

ответ

4

Нет времени, чтобы найти соответствующую JLS часть, но это просто: Если вы объявляете класс с параметром типа, а затем использовать его без него, компилятор удаляет все общие декларации класса. То есть

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

становится

public class A { 
    Map m; 
} 

Исправление очевидна: инстанцировать с общим параметром или удалить T.

+1

Это было ново для меня. Благодарю. – PeterMmm

0

Внутреннее поле B.a должно быть конкретизированы. Пробег

class B { 

    A<Object> a; 
Смежные вопросы