我有以下自定义迭代器:
class PetIterator<T extends Pet> implements Iterator<T>
我有这堂课:
class Dog extends Pet
但Java编译器不允许此强制转换(iterate
返回PetIterator
):
Iterator<Dog> dogs = (Iterator<Dog>)petstore.iterate (“dogs”);
除了写作之外,我如何找回我的黄金猎犬:
PetIterator dogs = petstore.iterate (“dogs”);
...
Dog dog = (Dog)dogs.next();
答案 0 :(得分:4)
您可以将iterate(String)
方法重写为:
class PetStore {
<T extends Pet> PetIterator<T> iterate(Class<T> clazz);
}
然后你可以安全地使用那种方法
PetIterator<Dog> dogs = petstore.iterate (Dog.class);
// ...
Dog dog = dogs.next();
答案 1 :(得分:3)
因为PetIterator<T extends Pet>
不是PetIterator<Dog>
。它可以是任何Pet
,然后您的iterator.next()
将无法转换为Dog
。
为什么不简单地使用class PetIterator implements Iterator<T>
(与petstore对象中的T
相同,我猜这也是通用的)