相关疑难解决方法(0)

通用通配符类型不应在返回参数中使用

是否可以说通用通配符类型不应该用在方法的返回参数中?

换句话说,声明一个如下所示的接口是有意义的:

interface Foo<T> {
  Collection<? extends T> next();
}
Run Code Online (Sandbox Code Playgroud)

另外,可以说通用通配符类型仅在方法的参数声明中有意义吗?

java generics

20
推荐指数
2
解决办法
1万
查看次数

在返回参数中使用通用通配符类型

通常不鼓励在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)

java generics bounded-wildcard

7
推荐指数
1
解决办法
3739
查看次数

标签 统计

generics ×2

java ×2

bounded-wildcard ×1