2017-11-23 3 views
1

はのは、どのように私はこのような何かをやって行くだろう汎用型とINSTANCEOF

class Animal { 

} 

class Dog extends Animal { 

} 

class Cat extends Animal { 

} 

class Rat extends Animal { 

} 

いくつかの仮定のクラスを設定してみましょうか?

List<Animal> listOfAnimals = ArrayList<Animal>(); 
listOfAnimals.add(new Dog); 
listOfAnimals.add(new Cat); 
listOfAnimals.add(new Rat); 
listOfAnimals.add(new Rat); 

//Return a list of animals that are the type of T 
public <T> ArrayList<T> animalsOfType(T animal) { 
    for (Animal A : listOfAnimals) { 
     if (A instanceof T) { 
      //The current animal in the list is the type of T 
     } 
    } 
} 

このコードは、このように私はこれを参照するSOページ他のカップルを見て、それが可能ではないですが、私は本当に回避策を理解していないことをしました私はこの

//Returns a list of all dogs from the current list of animals 
List<Dog> currentListOfDogs = animalsOfType(Dog); 

をやらせるだろう彼らが示唆しているもの(hereのようなもの)。これは可能ですか?このような結果を得るためには、クラスを再構成する必要がありますか?

ありがとうございます!

答えて

1

私はこれがあなたの望むものかはわかりません。

public static void main(String[] args) { 

    List<Animal> listOfAnimals = new ArrayList<>(); 
    listOfAnimals.add(new Dog()); 
    listOfAnimals.add(new Cat()); 
    listOfAnimals.add(new Rat()); 
    listOfAnimals.add(new Rat()); 

    List<Dog> result = animalsOfType(Dog.class, listOfAnimals); 

} 

public static <T> ArrayList<T> animalsOfType(Class<T> animal, List<Animal> listOfAnimals) { 
    ArrayList<T> list = new ArrayList<>(); 
    for (Animal A : listOfAnimals) { 
     if (animal.isInstance(A)) { 
      list.add((T) A); 
     } 
    } 
    return list; 
} 
+0

...:

public static <T extends Animal> List<T> animalsOfType(Class<T> animalClass, List<Animal> listOfAnimals) { return listOfAnimals.stream().filter(a -> a instanceof animalClass).collect(Collectors.toList()); } 

、あなたが呼び出すより if(A.isInstance(animal)) リストの動物が私が渡しているタイプの動物かどうかは分かりますか? –

+0

@Adam Besmer。 –

1

単純なJava 8ソリューションこの

public <T extends Animal> List<T> animalsOfType(Class<T> animalClazz) { 
    return listOfAnimals.stream().filter(animal -> clazz.isInstance(animal)).map(animal -> (T) animal).collect(Collectors.toList()); 
} 
1

そのをお試しください:私は私がしたいと思う

List<Dog> currentListOfDogs = animalsOfType(Dog.class, listOfAnimals);