2015-11-01 99 views
4

我有以下的实用工具类:这为什么不安全?

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(); 

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

+0

'MyClass.getList'应该是'MyClass.values',对吧? – CoronA

+0

@CoronA Excatly,我会在一分钟内解决。 –

+0

@CoronA完成... –

回答

4

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

假设返回的列表是List<MyFirstSubClassOfMyClass>。在将它铸造到List<MyClass<?>>之后,您可以将MyClass的实例添加到列表中,但该列表应该只包含MyFirstSubClassOfMyClass的实例。

+0

啊,我明白了。所以施放的安全性依赖于'getList(Class clazz)'的实现。我的意思是,如果它的执行如下'public static List getList(Class clazz){List lst = new ArrayList <>(); //等返回lst;}'警告可以被安全地消除,对吧? –

+1

如果这是实现,则可以禁止该警告,并且在运行时不会有问题。但是这违背了使用类型安全的泛型类型的观点。如果您的方法应始终返回列表,则其返回类型应为列表,而不是列表。 –

+0

如果它总是返回'List ',则铸造'(List >)MyUtils.getList(MyClass.class)'将产生编译错误'不能从列表到列表>'。这就是为什么我把它列入'List '。也许还有另一种方式来处理这些事情......我只是不知道。 –

相关问题