将具体对象列表转换为抽象类型

时间:2013-04-05 20:53:11

标签: java

here之前已经问过这个问题,但是解决方案显示的是“未选中投票”的警告。有没有更安全的方法来做到这一点。代码如下。

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; 

    }

1 个答案:

答案 0 :(得分: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;
}