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

标签 java generics compiler-warnings

我有一个包含某个父类(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/

相关文章:

java - JSP getQueryString() 和 getParameterMap() 返回不同的参数

java - 泛型使用基元数组而不是包装数组会产生意想不到的行为

c# - 具有泛型类型的接口(interface)用作第二个接口(interface)中的泛型类型

ios - 一般问题,有什么建议吗?

pattern-matching - 在类型上使用 'with sexp' 生成 "Warning 4: this pattern-matching is fragile"

c++ - 警告 C4101 未引用的局部变量

java - 在Java中如何使用 split() 函数从短语中提取字符串

java.lang.RuntimeException : An error occured while executing doInBackground() Android RSS Reader

java - 使用计时器启动 SwingWorker?

c# - 异常过滤器触发 CA2202?