0

更新:私のクラスはこれよりも複雑です、私はArrayList行で立ち往生しています

私は次のクラスを持っています:

class CatList {

    List<Cat> cats = new ArrayList<Cat>();

}

class DogList {

    List<Dog> dogs = new ArrayList<Dog>();

}

ここで、Catとdogは両方ともデータクラスです。

しかし、私は抽象クラスを作成したいと思います:

abstract class AnimalList {

    List<???> animals;

    AnimalList(Class animal) {

        animals = new ArrayList<???>();

    }
}

クラスを継承できるように

AnimalList CatList = new AnimalList(Cat);
AnimalList DogList = new AnimalList(Dog);
AnimalList CowList = new AnimalList(Cow);

うまくいけば、それはもっと理にかなっています。したがって、私の質問は何ですか?ビット?

4

3 に答える 3

5

型パラメーターを使用すると、継承なしで問題を解決できる場合があります(異なる型に同じクラスを使用する):

public class AnimalList<T> {
  private List<T> list = new ArrayList<T>();

  public void add(T animal) {
    list.add(animal);
  }
  // more methods
}

これで、人と動物のインスタンスをパラメータ化できます。

AnimalList<Cat> catList = new AnimalList<Cat>();
catList.add(new Cat());
AnimalList<Dog> dogList = new AnimalList<Dog>();
dogList.add(new Dog());
于 2012-07-28T16:17:16.243 に答える
1

私のアドバイスは、犬と猫の基本クラスを作成することです。たとえば、動物としましょう。このようにして、両方のクラスで同じメソッドとメンバーを作成する必要がないため、時間を節約できます。これは次のように機能します。

public (abstract) class Animal
{
    members and functions, that both Cats, and Dogs have... 
}

次に、次のようにAnimalから継承します。

public class Cat extends Animal
{
    ...
}

これからは、次のようなArrayListを作成できます。

ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(new Cat());
animals.add(new Dog());

とにかくAnimalListを作成したい場合、最良のオプションはAndreasのソリューションであり、ジェネリックはこの種の状況を対象としています。

継承がどのように機能するかを知っていて、このようなアプリケーションの構築をすでに検討している場合は、私の投稿をお詫びします。

于 2012-07-28T16:51:46.587 に答える
1

すでに述べたように、猫と犬の基本クラスの動物を定義してから、次のようにすることができます。

class AnimalList<T extends Animal> {

    private List<T> animals;

    protected AnimalList() {
       animals = new ArrayList<T>();
    }
}

クラスを渡す必要がある場合は、yjeコンストラクターを次のように定義する必要があります。

AnimalList(Class<T> type) { … }

不明な動物タイプのAnimalListを処理する必要がある場合は、次を使用できます。

private AnimalList<? extends Animal> list;
于 2012-07-28T19:26:30.560 に答える