需要使用泛型将列表过滤到特定子类

Nic*_*ole 7 java generics compiler-warnings

我有一个List包含某个超类(如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;
}
Run Code Online (Sandbox Code Playgroud)

Warning: Note: Test.java uses unchecked or unsafe operations.
Run Code Online (Sandbox Code Playgroud)

我没有任何其他方法来完成这个(我找不到任何东西Collections,但有可能一些JDK方法可以做到),但理想情况下它会提供以下接口:

List<Car> cars = getVehiclesOfType(Car.class);
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我在原始代码上收到编译器警告.

Dav*_*les 5

你得到一个警告,因为编译器(或IDE)无法知道强制转换是安全的,而不了解其含义isAssignableFrom().但isAssignableFrom()它不是语言功能,它只是一种库方法.就编译器而言,它就像你说的一样

    if (type.getName().contains("Elvis")) {
        result.add(type.cast(vehicle));
    }
Run Code Online (Sandbox Code Playgroud)

但是,你知道什么isAssignableFrom()意思,所以你知道它是安全的.这正是这种情况@SuppressWarnings的意思.

  • PS 我自己会使用 type.isInstance() 。 (2认同)