3

Animal.Class を拡張する Animal.Class と Dog クラスがあります。

これをすばやく簡単に行う方法があれば教えてください。

List<Dog> dogList = getAnimalList();

public List<Animal> getAnimalList(){
     List<Animal> animalList = new LinkedList<Animal>();
     return animalList;
}

絶対に必要でない限り、動物リスト全体をもう一度見たくありません。

犬のクラスには、他のチェック目的のために追加のブール値が含まれているだけです。

4

2 に答える 2

6

ジェネリックスの継承は、Javaの継承の原則と少し異なります。使用する必要があります?(ワイルドカード)

List<? extends Animal> dogList = getAnimalList();

編集:

ワイルドカードガイドライン:

  1. 「in」変数は、extendsキーワードを使用して、上限のあるワイルドカードで定義されます。
  2. 「out」変数は、superキーワードを使用して、下限のワイルドカードで定義されます。
  3. Objectクラスで定義されたメソッドを使用して「in」変数にアクセスできる場合は、無制限のワイルドカードを使用してください。
  4. コードが「in」変数と「out」変数の両方として変数にアクセスする必要がある場合は、ワイルドカードを使用しないでください。
于 2012-08-17T03:28:27.917 に答える
1

あなたの質問は完全には明確ではないので、私はあなたの問題であるかもしれないものに対処するだけです。

多くの種類の動物を含む動物のリストがある場合:

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

そして、そのリストの要素を特定のサブタイプにフィルタリングしたい場合は、そのリストを繰り返し、サブタイプにチェック/キャストする必要があります。

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

for (Animal animal : animals) {
    if (animal instanceof Dog) {
        dogs.add((Dog)animal);
    }
}

これはGuavaを使用して簡単に行うことができます:

List<Dog> dogs = Lists.newArrayList(Iterables.filter(animals, Dog.class));
于 2012-08-17T03:46:25.790 に答える