2016-05-13 94 views
0

是否指定参数化泛型的继承关系不足以确保类型安全性?例如:Java泛型扩展仍然会生成未经检查的转换警告

public class ListCastFunction<F, T extends F> implements Function<F, T> { 
    public final T apply(final F from) { 
     return (T) from; 
    } 
} 

这仍然会生成编译器警告。如果我们知道T extends F,它真的没有选中?

回答

9

你铸造和FT,但由于T extends F,你明确向下转换。无法保证该方法中给出的FT。假设我做这个,假设隐含的父子关系是由:

ListCastFunction<Animal, Mammal> lcf = new ListCastFunction<>; 
Mammal i = lcf.apply(new Fish()); 

执行时,这将打破,因为Fish不是Mammal,但它适合你的代码。

+0

谢谢。有没有明确要求'F'给出的是'T'而没有刻意检查? –

+1

在声明中使用'T'而不是'F'? – sisyphus

+1

@CannonPalms确保'F'是'T'的唯一方法是如果'F extends T' - 然后你不需要投射 - 但是你也可以只使用'new ArrayList (listOfT)' ,不需要'ListCastFunction'。 –

相关问题