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 に答える