在Java中转换泛型类型

时间:2010-12-06 12:18:22

标签: java generics casting

我有以下自定义迭代器:

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();

2 个答案:

答案 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相同,我猜这也是通用的)