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时,首选哪个版本以及为什么?
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)