回归收藏<?扩展Type> vs Collection <Type>

use*_*634 4 java generics extends wildcard

这两种方法有什么区别?

Collection<Type> getTypes();
Run Code Online (Sandbox Code Playgroud)

VS

Collection<? extends Type> getTypes();
Run Code Online (Sandbox Code Playgroud)

如果Type是类或接口,这是否重要?特别是,在设计API时,首选哪个版本以及为什么?

ars*_*jii 8

Collection<Type> getTypes();
Run Code Online (Sandbox Code Playgroud)

在这里,getTypes()必须返回Collection<Type>(例如ArrayList<Type>HashSet<Type>).

Collection<? extends Type> getTypes();
Run Code Online (Sandbox Code Playgroud)

在这里,getTypes()可以返回Collection任何或延伸的东西Type,(例如ArrayList<SubType>HashSet<SubType>).因此,从第一个变量返回的任何内容也可以从第二个变量返回.但是,在第二个中,您不知道集合的类型参数究竟是什么; 你只知道它延伸了Type.

至于哪个应该是首选,它实际上取决于你想要做什么,以及什么在逻辑上更有意义.请记住,当你拥有时<? extends Type>,你实际上并不知道它是什么?,这有时会阻碍它; 通常情况下,第一种变体更适合.您可以在基类中使用第二个变体,并在子类中使用与第一个类似的东西覆盖它,例如:

@Override
Collection<SubType> getTypes() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @stonedsquirrel 返回类型为 `Collection&lt;? 的方法 extends Type&gt;` 可以返回一个 `Collection&lt;Type&gt;`。 (2认同)