我的问题是可以编写这样一个类:
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
答案 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);