我有一个List
,其中包含某个父类(super class)(例如Vehicle),并且我想编写一个方法,该方法返回该列表中作为某个子类(例如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
所针对的情况。