我有一個類與泛型。我知道泛型類型信息在運行時被剝離,但是這是綁定類型。我認爲在編譯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
這不是那麼簡單@波希米亞。有界的類型會稍微改變規則。正如Sotirios所示,當T擴展Animal時,通常返回T的實例方法仍然會以原始類型返回Animal。我的困惑是爲什麼迭代器沒有參數化爲Animal。 – bmauter