是否可以说通用通配符类型不应该用在方法的返回参数中?
换句话说,声明一个如下所示的接口是有意义的:
interface Foo<T> {
Collection<? extends T> next();
}
Run Code Online (Sandbox Code Playgroud)
另外,可以说通用通配符类型仅在方法的参数声明中有意义吗?
通常不鼓励在Java中的返回参数中使用通用通配符类型.例如,Effective Java,第28项规定:
不要将通配符类型用作返回类型.它不会为您的用户提供额外的灵活性,而是迫使他们在客户端代码中使用通配符类型.
正确使用的通配符类型对于类的用户几乎是不可见的.它们使方法接受它们应该接受的参数并拒绝它们应该拒绝的参数.如果类的用户必须考虑通配符类型,那么类的API可能有问题.
但在某些情况下,它似乎是最佳选择,例如在下面的代码中:
import java.util.*;
import java.lang.*;
import java.io.*;
class Container
{
private final Map<String, Type<?>> itemMap = new HashMap<>();
public <T> void addItem(String key, T t) {
itemMap.put(key, new Type<>(t));
}
public Collection<Type<?>> getAllItems() {
return itemMap.values();
}
public static class Type<T> {
private final T value;
public Type(T value) {
this.value = value;
}
@Override
public String toString() {
return "Type(" + value + ")";
}
}
public static void main (String[] args)
{ …Run Code Online (Sandbox Code Playgroud)