通用代码中的混淆

时间:2016-02-10 06:31:41

标签: java list generics

List<? extends someObject> list
List<? extends Comparable<? super T>> list

我无法理解第二个代码。据我所知,从第一个代码,它存储任何扩展某些对象的对象,但在第二个代码中是否意味着它存储接口?

1 个答案:

答案 0 :(得分:0)

第一个是至少SomeObject列表。可能是您无法在列表中插入SomeObject,如果它是真正的子类列表。以这种方式看待它:

List<? extends Animal> list

这是至少Animal 的某些事情的列表。可能是这种情况,这是一个列表,或狗列表。我们不知道,因此?。无论如何,我们知道我们可以从列表中获得至少Animal个,但我们不能插入,因为我们不知道列表中的确切类型。

第二个是适用于T或某些超类的类似实现(或派生接口)的列表。因此,此列表中的所有对象都可用于比较T个对象。但是,当然,和以前一样,我们无法确定列表用作项目的Comparable的确切类型,因此我们无法添加任何内容,我们只能以此形式阅读。

修改:展开Comparable<? super T>:使用super代替extends似乎违反直觉。这是因为如果你想比较两件事,你可以通过比较事物本身或事物的任何更高类别来做到这一点。所以,如果我想比较,我就足以知道如何比较 animals 。如果我可以比较动物我可以比较任何动物,包括狗,猫等。如果我只知道如何比较我可能不知道如何比较。因此,如果您想找一个人来比较T,您必须找一个可以比较TT的任何超类的人。