2013-04-05 107 views
0

here之前已经提出了这个问题,但是解决方案显示警告显示“未检查投射”。有没有更安全的方法来做到这一点。代码如下。将具体对象列表投射到抽象类型

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. 

是有原因的,为什么编译器不会让你铸造类型具有不同的泛型类型:

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; 

    } 
+0

的可能重复[JAVA:铸造名单列出(http://stackoverflow.com/questions/11999364/java-casting -listanimal到listdog)。另请参阅:[列表是列表的子类吗?为什么不是Java的泛型隐含多态?](http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicit?lq=1)。 – 2013-04-05 21:02:46

回答

2

,因为这不是安全的。您可以绕过此限制,但这可能会导致运行时出现严重问题(* 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; 
} 
+0

然后什么是正确的解决方案? – learningtocode 2013-04-05 21:00:39

+0

@downvoter请解释你的downvote。 – 2013-04-05 21:01:24

+0

@learningtocode我不明白你想达到什么目的。很显然,将矢量转换为矢量是一个糟糕的主意,但是你没有解释为什么你需要这样的演员。 – 2013-04-05 21:06:13