给出:
class Foo {
...
}
class Bar<T extends Foo> {
...
}
假设我要列出Bar
的实例列表,并且允许使用Bar
的任何通用类型,则该列表的类型可以是以下两种选择之一:
List<Bar<?>>
List<Bar<? extends Foo>>
1)我假设这些列表可以包含完全相同的对象,即任何通用类型的Bar的实例。这是真的吗?
2)首选哪种类型?我应该更明确地重述Bar
的通用类型上的界限(第二个选择),还是只选择列表中无界的通配符,并保证Bar
的实例只能在放入列表(第一个选项)之前,对泛型类型有一定的限制吗?
答案 0 :(得分:1)
1)我假设这些列表可以包含完全相同的对象,即任何通用类型的Bar的实例。这是真的吗?
两个列表只能包含Bar<T>
,其中T
是Foo
或其任何子级。
2)首选哪种类型?
在这种情况下两者都是等效的。但是,阅读代码比编写代码更重要。用户可能会认为“ 哦,这是一个无界通配符,所以我可以使用任何类型。”,但是由于Bar
的有界通配符,他们会错了。因此,在某些情况下,后者可能是更可取的选择,但总之,这是您的要求。