2014-12-15 2 views
0

У меня проблема, которая сильно ошеломила меня.Ошибка компиляции Java "for"

У меня есть класс (бар) с помощью метода геттера, который возвращает список:

public abstract class Bar<T extends IdentifiableObject> { 
... 
public List<Bar> getBars() { 
    return bars; 
} 
... 

Иерархия у меня есть:

public abstract class Bar<T extends IdentifiableObject>; 
public abstract class IdentifiableObject<T extends Comparable<T>>; 

Пока здесь все работает нормально, проблема в том, когда Я исполняю:

for(Bar bar : bars.getBars()) { 
} 

предыдущее предложение вызывает ошибку компиляции:

incompatible types: java.lang.Object cannot be converted to java.util.List<com.x.Bar> 

Я был удивлён с этой ошибкой, но я был более удивлен, когда я выступал

List<Bar> bars = bar.getBars(); 
Iterator<Bar> iterator = bar.getBars().iterator(); 

и без проблем

Что-то здесь не в «за» предложения?

Спасибо

+11

В основном это происходит потому, что вы используете необработанный тип 'Bar' вместо параметризованной версии. Избегайте сырых типов, таких как чума. –

+1

Вы не сказали, что «бары» находятся в вашем примере «для», но комментарий Джона выше почти наверняка является проблемой. –

+1

Java не любит смешивать исходные типы с дженериками. Попытайтесь использовать тот или иной. Если вам не нужны дженерики (поскольку вы, кажется, не используете 'Bar ', а скорее 'Bar'), выведите генерики. –

ответ

0

Создать экземпляр класса Bar, как показано ниже:

Bar<?> bar = new Bar(); 

Добавить вышеуказанную строку перед кодом

List<Bar> bars = bar.getBars(); 
Iterator<Bar> iterator = bar.getBars().iterator(); 
+0

Я не могу создать экземпляр абстрактного класса –

+0

Извините .. Я пропустил это. Что делает «бары» удерживать в приведенной ниже строке. Список getBars() { бары возврата; } – Awanish

+0

Это только для древовидной структуры с дочерними элементами того же типа –

Смежные вопросы