我有一个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所针对的情况。

10-06 00:55