为什么这不安全?

时间:2015-11-01 07:58:37

标签: java generics

我有以下实用程序类:

public class MyUtils{

    public static <T> List<? extends T> getList(Class<T> clazz){
        //returning some list
    }
}

使用该方法的类:

public class MyClass<T>{

    public static List<MyClass<?>> values(){
        return (List<MyClass<?>>) MyUtils.getList(MyClass.class); //Warning, unchecked cast.
    }
}

目前尚不清楚为什么这不安全?该方法的结果不能分配给这样的变量:

List<MyClass<? extends Integer>> lst = MyClass.values(); //compile-error

我们可以分配方法结果的唯一方法是:

List<MyClass<?>> dsss = MyClass.values();

那么,这样的演员会导致什么样的运行时错误呢?

1 个答案:

答案 0 :(得分:4)

getList()会返回未知类型的列表。你将它投射到List<MyClass<?>>。怎么可能安全?

假设返回的列表是List<MyFirstSubClassOfMyClass>。在将其转换为List<MyClass<?>>之后,您将能够将MyClass的实例添加到列表中,尽管该列表应该只包含MyFirstSubClassOfMyClass的实例。