java - 使用 Java 泛型、类型参数和返回列表的未经检查的强制转换警告

标签 java generics type-parameter

此代码已从更复杂的类结构中尽可能地简化。在实际代码中,有我在这里使用的 Integer 和 Double 类型的子类型。

我正在尝试将 Java 泛型与类型参数一起使用。如果用户请求 Number.class 的类型,我们想合并 List<Integer>列表和 List<Double>将列表合并为一个列表。

虽然代码有效,但我无法摆脱未经检查的强制转换警告(请参阅 TODO 标记)。警告是:

Type safety: Unchecked cast from List<Integer> to Collection<? extends T>

但是,如果我删除强制转换,则会出现编译错误:

The method addAll(Collection<? extends T>) in the type List<T> is not applicable for the arguments (List<Integer>).

我的代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class Generics1 {

    static final List<Integer> intList = new ArrayList<Integer>(Arrays.asList(
        1, 2, 3, 4));
    static final List<Double> dblList = new ArrayList<Double>(Arrays.asList(
        1.1, 2.2, 3.3));

    public static <T extends Number> List<T> getObjects(Class<T> type) {
        List<T> outList = new ArrayList<T>();
        if (type == Number.class) {
            // user asked for everything
            // TODO: unchecked cast warnings here should be fixed
            outList.addAll((Collection<? extends T>) intList);
            outList.addAll((Collection<? extends T>) dblList);
        } else {
            // user asked for subtype of number
            if (Integer.class.isAssignableFrom(type)) for (Integer i : intList)
                if (type.isInstance(i)) {
                    T obj = type.cast(i);
                    outList.add(obj);
                }
            if (Double.class.isAssignableFrom(type)) for (Double d : dblList)
                if (type.isInstance(d)) {
                    T obj = type.cast(d);
                    outList.add(obj);
                }
        }
        return outList;
    }

    public static void main(String[] args) {
        System.out.println("HI!");
        System.out.println("integers: " + getObjects(Integer.class));
        System.out.println("doubles: " + getObjects(Double.class));
        System.out.println("numbers: " + getObjects(Number.class));
    }
}

最佳答案

您可以将此添加到您的代码中:

@SuppressWarnings("未检查")

这是另一篇解释“什么”含义的 SO 帖子:What is SuppressWarnings ("unchecked") in Java?

这是另一个处理可能有用的链接转换的方法:How do I fix "The expression of type List needs unchecked conversion...'?

尽管通过一些重新编码,您可能会使警告完全消失并且不需要被抑制。

关于java - 使用 Java 泛型、类型参数和返回列表的未经检查的强制转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3790046/

相关文章:

Java 子字符串如果为零则删除第一个字符

java - 从内部循环重新绘制 JPanel

java - 为什么/何时应该使用泛型方法?

Java 下界通配符

Haskell - 限制数据参数

Java泛型可分配性

java - 设置 log4j2 日志文件的相对路径

java - Java中哪个类实现了抽象类EnumSet?

java - 通用节点是否需要成为通用列表的一部分?

scala - 为什么reduceLeft的类型参数包含下界?