0

这已经在这里问过,但解决方案显示警告说“未经检查的演员”。有没有更安全的方法来做到这一点。代码如下。

public abstract class Animal {
.
..
public class Dog extends Animal{

..
    public Vector<Animal> myFunc(String[] args) {
        // TODO Auto-generated method stub

        Vector<Dog> arVector = new Vector<Dog>();
        return  (Vector<Animal>)(List<?>) arVector; 

    }
4

1 回答 1

2

这不安全,因为:

Vector<Dog> dogVector = new Vector<Dog>();
Vector<Animal> animalVector = (Vector<Animal>)(List<?>) dogVector;
animalVector.add(new Animal()); // seems to be ok, but...
Dog dog = dogVector.get(0); // Runtime exception - there's Animal, not Dog in your Vector.

编译器不允许您转换具有不同泛型类型的类型是有原因的。您可以绕过此限制,但这可能会导致运行时出现严重问题 (*ClassCastException*s)。

编辑:

问题是您必须返回带有动物的向量,但您会根据某些条件创建狗或猫的向量。你可以做的是:

public Vector<? extends Animal> myFunc(String[] args) {
   Vector<Dog> vector = new Vector<Dog>();
   // ...
   return vector;
}

或者:

public Vector<Animal> myFunc(String[] args) {
   Vector<Animal> vector = new Vector<Animal>();
   vector.add(new Dog());
   return vector;
}
于 2013-04-05T20:56:48.823 回答