为什么Java强制使用泛型类型?

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)

Mol*_*daa 5

T延伸形状,多边形延伸形状.所以T没有理由扩展Polygon


Ale*_*yak 5

我们假设您已经像这样实例化了您的类:

Foo<Circle> circleFoo = new Foo<Circle>( );
Run Code Online (Sandbox Code Playgroud)

然后,Set<Circle>无法安全分配HashSet<Polygon>

getFirst:你不能安全地转换PolygonCircle

而在getShapes:你不能安全地投Iterable<Polygon>Iterable<Circle>.