У меня есть класс с дженериками. Я знаю, что информация об общем типе разделяется во время выполнения, но это связано со связанным типом. Я думал, что при компиляции java.lang.Object
заменяется связанным типом. Если я знаю, что все всегда будет как минимум Animal
, то почему компилятор оставляет его как Object
? Есть ли что-то, что мне не хватает, что бы эта работа, как я хочу? В частности, этот последний цикл for
в основном методе имеет проблему времени компиляции.Что такое стирание ограниченного родового типа?
Спасибо!
public static void main(String[] args) throws Exception {
Litter<Cat> catLitter = new Litter<>();
for(Cat cat : catLitter) {}
Litter<Animal> animalLitter = new Litter<>();
for(Animal animal : animalLitter) {}
Litter litter = new Litter();
for(Animal animal : litter) {} // Type mismatch: cannot convert from element type Object to Animal
}
public class Litter<T extends Animal> implements Iterable<T>{
@Override public java.util.Iterator<T> iterator() {
return new LitterIterator();
}
class LitterIterator implements java.util.Iterator<T> {
@Override public boolean hasNext() { return false; }
@Override public T next() { return null; }
}
}
public class Animal {}
public class Dog extends Animal{}
public class Cat extends Animal{}
Если вы включите все предупреждения компилятора, вы увидите, что вы используете необработанный тип для 'litter', что существенно заставляет компилятор игнорировать существование дженериков полностью для этого оператора. – VGR
Если тип не указан, вся общая информация удаляется - вы остаетесь только с Object. – Bohemian
Это не так просто @Bohemian. Ограниченный тип немного изменяет правила. Как показывает Сотириус, метод экземпляра, который обычно возвращает T, когда T расширяет Animal, по-прежнему будет возвращать Animal по необработанному типу. Моя путаница в том, почему Итератор не параметризуется Animal. – bmauter