如何使用泛型缩小类类型?

时间:2015-04-08 06:11:05

标签: java generics

我的问题是可以编写这样一个类:

public class Storage{
    protected Map<String, ? extends Serializable> properties = new HashMap<>();

    public <T extends Serializable> void put(String name , T value){
        properties.put(name, value);
    }
}

当尝试像这样使用它时:

Storage s = new Storage();
List<String> list = new ArrayList<>();
s.put("name", list);

通过上面的代码对我来说似乎是合法的,它不会编译。 我正在研究泛型常见问题,但无法找到解决方案,也许它根本不可能?

这是编译错误

Error: where T is a type-variable: T extends Serializable declared
in method <T>put(String,T) where CAP#1 is a fresh type-variable: CAP#1
extends Serializable from capture of ? extends Serializable

2 个答案:

答案 0 :(得分:3)

您应该查看PECS Producer extends Consumer Super )概念。您无法向? extends Serializable添加任何内容。你只能从中读取。如果要将类型T的实例添加到集合中,请使用? super T(它充当消费者,即接受值)。

答案 1 :(得分:2)

您可以执行以下操作:

public class Storage{
    protected Map<String, Serializable> properties = new HashMap<>();

    public <T extends Serializable> void put(String name , T value){
        properties.put(name, value);
    }
}

请注意,List界面不会延伸Serializable

Storage s = new Storage();
ArrayList<String> list = new ArrayList<>();
s.put("name", list);