什么是使用Collection <?扩展SomeAbstractClass>而不是Collection <SomeAbstractClass>

cpa*_*ann 5 java generics

因此,假设我们有一个Java应用程序,其中包含一个名为的抽象类,SomeAbstractClass以及至少10个超类的子类.

什么是使用这种抽象超类在泛型中的方式,Collection<? extends SomeAbstractClass>而不仅仅是使用Collection<SomeAbstractClass>

也许我错过了仿制药中非常基本的东西.

Boh*_*ian 4

这两种声明的区别:

Collection<? extends A> c1;
Collection<A> c2;
Run Code Online (Sandbox Code Playgroud)

c2 可以保存 A 或任何子类的实例,但 c1 可以保存 A(或 A)的某些未知但特定的子类或任何未知类的子类的实例。

您无法向 c2 添加项目,因为编译器不知道它是什么类型,只有当您取出一个项目时,它才能转换为 A。

此外,您不能将 c1 分配(即强制转换)到 c2 - c1 不是 c2 类型的子类。