作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个包含各种子类型的对象列表:
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/
我是一名优秀的程序员,十分优秀!