这两种方法有什么区别?
Collection<Type> getTypes();
vs
Collection<? extends Type> getTypes();
类型是类还是接口有关系吗? 特别是在设计API时,应该优先选择哪个版本?为什么?
Collection<Type> getTypes();
getTypes()
必须返回一个 Collection<Type>
(例如 ArrayList<Type>
或 HashSet<Type>
)。请注意,不要更改或删除 HTML 标签。Collection<? extends Type> getTypes();
getTypes()
可以返回任何一个是或继承了Type
的Collection
(例如ArrayList<SubType>
或HashSet<SubType>
)。因此,第一种情况下可以返回的任何内容也可以从第二种情况下返回。但是,在第二种情况下,您不知道集合的类型参数实际上是什么;您只知道它扩展了Type
。<? extends Type>
时,您实际上不知道?
是什么,有时这可能会妨碍您;通常第一种情况更合适。您可以在基类中使用第二种情况,并在子类中覆盖它,使其更类似于第一种情况,例如:@Override
Collection<SubType> getTypes() {
...
}
Collection<? extends Type>
的方法可以返回Collection<Type>
。 - arshajiiclear()
方法仍然有效,一些迭代器可以 delete()
。 - Judge MentalCollection<? extends Type>
不能包含类型为Type
的对象,然后你又说它可以。 - Louis Wasserman<? extends Type>
是一个有边界的通配符泛型。以这种方式定义的集合可以是类型的任何子类或者 Type
本身。
Collection<Type> typeCollection;
//or
Collection<SubType> subtypeCollection;
//where subtype is...
class SubType extends Type
在这种情况下,唯一重要的是 ?
是 Type
类型。
Collection<Type>
必须返回一个 Type
的集合。例如:
Collection<Type> collection;
点击此处查看更多信息,具体选择取决于您的需求。
以下是一个例子。当定义可呈现的项目组时,我使用有界通配符。例如:
public class SpriteGroup<T extends Sprite>
这将是一个Sprites的集合,或者任何Sprite的子类。这很有用,因为我可以这样定义组:
SpriteGroup<PhysicalSprite> physicalSprites = new SpriteGroup<PhysicalSprite>();
PhysicalSprite physicalSprite = physicalSprites.get(0);
SpriteGroup<ParticleSprite> particleSprite = new SpriteGroup<ParticleSprite>();
ParticleSprite particle = particleSprite.get(0);
任何获取/设置例程都返回我指定的类型(PhysicalSprite、ParticleSprite),这是理想的。
如果我定义为:
SpriteGroup<Sprite> spriteGroup = new SpriteGroup();
//all I can retrieve is a sprite, gotta cast now...
Sprite sprite = spriteGroup.get(0);
我需要将它们转换为特定于每种类型的Sprite的属性。任何SpriteGroup
的子类也会受到同样的限制。
Collection<Type>
和Collection<SubType>
(其中SubType扩展了Type)并不相同。 - rocketboy