如果类通用类型已经绑定,则通配符绑定吗?

时间:2018-07-01 01:40:24

标签: java generics types

给出:

class Foo {
    ...
}

class Bar<T extends Foo> {
    ...
}

假设我要列出Bar的实例列表,并且允许使用Bar的任何通用类型,则该列表的类型可以是以下两种选择之一:

List<Bar<?>>
List<Bar<? extends Foo>>

1)我假设这些列表可以包含完全相同的对象,即任何通用类型的Bar的实例。这是真的吗?

2)首选哪种类型?我应该更明确地重述Bar的通用类型上的界限(第二个选择),还是只选择列表中无界的通配符,并保证Bar的实例只能在放入列表(第一个选项)之前,对泛型类型有一定的限制吗?

1 个答案:

答案 0 :(得分:1)

  

1)我假设这些列表可以包含完全相同的对象,即任何通用类型的Bar的实例。这是真的吗?

两个列表只能包含Bar<T>,其中TFoo或其任何子级。

  

2)首选哪种类型?

在这种情况下两者都是等效的。但是,阅读代码比编写代码更重要。用户可能会认为“ 哦,这是一个无界通配符,所以我可以使用任何类型。”,但是由于Bar的有界通配符,他们会错了。因此,在某些情况下,后者可能是更可取的选择,但总之,这是您的要求。