Кастинг для каждого цикла - PullRequest
2 голосов
/ 23 февраля 2012

Рассмотрим приведенный выше пример кода.

Почему компилятор жалуется на «несовместимые типы» в цикле 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()) { 
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

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

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

становится

public class A {
    Map m;
}

Исправление очевидно: создайте экземпляр A с универсальным параметром или удалите T.

0 голосов
/ 23 февраля 2012

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

class B {

    A<Object> a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...