让我们设置一些假设的课程
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
}
}
}
这段代码因此让我这样做
//Returns a list of all dogs from the current list of animals
List<Dog> currentListOfDogs = animalsOfType(Dog);
我已经看到其他几个SO页面引用了这个并且这是不可能的,但我并不真正理解他们建议的解决方法(例如引用的here)。这是可能的,为了达到这样的结果,我究竟需要如何重构我的类?
提前致谢!
答案 0 :(得分: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;
}
答案 1 :(得分:1)
试试这个
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());
}
答案 2 :(得分:1)
它是一个简单的java 8解决方案:
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());
}
而不是你会打电话:
List<Dog> currentListOfDogs = animalsOfType(Dog.class, listOfAnimals);