gpt4 book ai didi

Java - 返回指定泛型类型的列表

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:39 24 4
gpt4 key购买 nike

我有一个包含各种子类型的对象列表:

List<Dog> dogList = new ArrayList<>();
dogList.add(new Poodle())
dogList.add(new Dalmation());

我想搜索这个列表并返回指定类的所有实例:

public <T extends Dog> List<T> getAll(Class<T> dogType){
List<T> returnObjects = new ArrayList<>();
for(T obj : dogList){
if(dogType.instanceOf(obj){
returnObjects.add(dogType.cast(obj));
}
}
return returnObjects;
}

用法:

List<Poodle> poodleList = getAll(Poodle.class); 

这是我第一次正式涉足泛型,感觉事情有点失控了。这是一种体面的做事方式,还是我错过了更简单/明显的解决方案?

编辑:更新为使用 instanceOf() 和 cast() 以避免未经检查的转换

最佳答案

既然您提到您使用的是 Java 8,那么您可以使用 Stream API:

public static <T extends Dog> List<T> getAll(Class<T> dogType) {
return dogList.stream()
.filter(dogType::isInstance)
.map(dogType::cast)
.collect(toList());
}

此方法将从狗列表中创建一个 Stream,通过仅保留给定类的实例来过滤它们,转换为给定类,最后将该 Stream 收集到一个列表中.

使用 isInstance 意味着如果您使用 Poodle.class 调用该方法,那么所有的狗都是 Poodle 或 sub - Poodle 类将被保留。如果您只想养 Poodle ,您可以使用Class.equals(other)

此外,请注意,使用 cast 方法时,不会出现未经检查的警告(此方法已经处理了它)并且在这里这样做是安全的,因为我们之前过滤了正确的元素:没有 ClassCastException 可以被抛出。

关于Java - 返回指定泛型类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34206206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com