我有一个包含某个父类(super class)(如 Vehicle)的 List
,我想编写一个方法来返回该列表中的对象,这些对象是某个子类(如 Car)的实例.
到目前为止我有这个,但它会生成一个典型的“未经检查”的操作编译器警告:
public <T extends Vehicle> List<T> getVehiclesOfType(Class<T> type) {
List<T> result = new ArrayList<T>();
for (Vehicle vehicle : getVehicles()) {
if (type.isAssignableFrom(vehicle.getClass())) {
result.add(type.cast(vehicle)); // Compiler warning here
// Note, (T)vehicle generates an "Unchecked cast" warning (IDE can see this one)
}
}
return result;
}
Warning: Note: Test.java uses unchecked or unsafe operations.
我可以使用任何其他方法来完成此操作(我在 Collections
中找不到任何内容,但可能某些 JDK 方法可以做到),但理想情况下它会提供以下接口(interface):
List<Car> cars = getVehiclesOfType(Car.class);
不过,我想知道为什么我在原始代码上收到编译器警告。
最佳答案
您收到警告是因为如果不理解 isAssignableFrom()
的含义,编译器(或 IDE)就无法知道转换是安全的。但是 isAssignableFrom()
不是一种语言特性,它只是一种库方法。就编译器而言,这与您所说的一样
if (type.getName().contains("Elvis")) {
result.add(type.cast(vehicle));
}
但是,您知道 isAssignableFrom()
的含义,因此您知道它是安全的。这正是 @SuppressWarnings
所针对的情况。
关于java - 需要使用泛型将列表过滤到特定的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605532/