2013-04-05 122 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