Pau*_*son 2 java generics collections casting
我不明白为什么当参数化类型定义为扩展基类时,编译器无法看到强制转换是安全的.以下是演员的例子,在我看来他们应该是不必要的.此外,当我确实包含演员表时,我的IDE(IntelliJ IDEA)会警告演员表未经检查,好像是表明我做错了.有没有避免这些演员和警告的成语?为什么需要强制转换,因为声明声明类型扩展了基类?
class Shape {}
class Polygon extends Shape {}
public class Foo<T extends Shape>
{
Set<Polygon> polygons;
// Why must this be cast?
Set<T> shapes = (Set<T>) new HashSet<Polygon>();
T getFirst()
{
// Why must this be cast?
return (T) polygons.iterator().next();
}
Iterable<T> getShapes()
{
// Why must this be cast?
return (Iterable<T>) polygons;
}
}
Run Code Online (Sandbox Code Playgroud)
我们假设您已经像这样实例化了您的类:
Foo<Circle> circleFoo = new Foo<Circle>( );
Run Code Online (Sandbox Code Playgroud)
然后,Set<Circle>无法安全分配HashSet<Polygon>
在getFirst:你不能安全地转换Polygon到Circle
而在getShapes:你不能安全地投Iterable<Polygon>来Iterable<Circle>.