2013-04-05 3 views
0

Это предложение было задано до 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; 

    } 
+0

возможно дубликат [JAVA: Кастинг Список к списку ] (http://stackoverflow.com/questions/11999364/java-casting -listanimal к listdog). См. Также: [Is 'List ' подкласс 'List '? Почему не генерические генераторы Java неявно полиморфны?] (Http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicit?lq=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).

EDIT:

Проблема заключается в том, что вы должны вернуть вектор с животными, но создать вектор из собак или кошек в зависимости от некоторых условий. Что вы можете сделать, это:

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

+0

@downvoter Пожалуйста, объясните свой нижний предел. –

+0

@learningtocode Я не понимаю, чего именно вы хотите достичь. Очевидно, что литье вектора в вектор - плохая идея, но вы не объяснили, почему вам нужен такой бросок. –