通用类型和实例

时间:2017-11-23 03:03:36

标签: java class generics inheritance 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
        }
    }
}

这段代码因此让我这样做

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

我已经看到其他几个SO页面引用了这个并且这是不可能的,但我并不真正理解他们建议的解决方法(例如引用的here)。这是可能的,为了达到这样的结果,我究竟需要如何重构我的类?

提前致谢!

3 个答案:

答案 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);