0

パラメトリック ポリモーフィズムについて質問があります。子型が混在するコレクションがある場合、実際の型を特定してキャストを回避するにはどうすればよいですか。例えば

    class Animal{

    }

    class Bird extends Animal{
          void fly(){}
    }

    class Dog extends Animal{
          void bark(){}
    }

    ArrayList<Animal> list = new ArrayList<Animal>();

問題は、Animal コレクションを繰り返し処理するときに、どれがどれであるかをどのように知るかです。実際の型を毎回確認するために instanceof を使用する必要がありますか?

    for(Animal animal : list){
          if(animal instanceof Dog){
                ((Dog) animal).bark();
          } 
          else ((Bird) animal).fly();             
    }
4

3 に答える 3

6

これを行う必要がある場合、それは一般的なアクションであることを意味します。あなたは通常これを持っているでしょう:

abstract class Animal {
     abstract void act();
}

class Bird extends Animal{
      void fly(){}
      void act(){
         fly();
      }
}

class Dog extends Animal{
      void bark(){}
      void act(){
         bark();
      }
}

actループでは、メソッドを呼び出すだけです。

for(Animal animal : list){
    animal.act();
}
于 2012-11-15T19:42:06.570 に答える
0

そのようなリストを持つべきではありません。それ以外の場合instanceof(または.getClass())、その後にダウンキャストが続くことが唯一のオプションです。

于 2012-11-15T19:43:50.660 に答える
0

使用instanceofすると、ジェネリックの目的が無効になります。ジェネリックのポイントは、型が何であるかを気にしないように動作を定義することです。例:

public interface Animal {
    void speak();
    void fly();
}

public class Dog implements Animal {
    public void speak() {
        System.out.println("Woof!");
    }
    // Do nothing!
    public void fly() { }
}

public class Bird implements Animal {
    public void speak() {
        System.out.println("Tweet!");
    }
    public void fly() {
        System.out.println("I'm flying!!");
    }
}

public static void main (String[] args) {
    // list populating removed
    for(Animal animal : list) {
        animal.speak();
        animal.fly();
    }
}

見る?実行時に動物がどのタイプであるかは実際には気にしません。オブジェクトに本来あるべきことをさせます。

ちなみに、メソッドだけBirdが必要な場合は、のすべてのインスタンスでメソッドfly()を呼び出そうとしないでしょう...別のfly()AnimalList<Bird>

于 2012-11-15T19:45:38.950 に答える