我有一个关于Java泛型的问题。说我有以下接口:Java - 泛型和通配符&接口与实现
public static class Something<T> {
public void set(T t) {
}
}
public static interface Manager<T> {
public void add(final String key, final Something<T> o);
public Something<T> get(final String key);
}
用法的例子:
final Manager<Number> m = ...;
m.add("key", new Something<Number>());
m.get("key").set(new Integer(5));
我也想能够添加Something<Integer>
,Something<Double>
,...到一个Manager<Number>
。我会说我必须改变添加功能的签名:
public static interface Manager<T> {
public void add(final String key, final Something<? extends T> o);
public Something<T> get(final String key);
}
final Manager<Number> m = ...;
m.add("key", new Something<Integer>());
m.get("key").set(new Integer(5));
到目前为止,这么好。让我们看一可能实施方案经理:
public static class ManagerImplementation<T> implements Manager<T> {
protected HashMap<String, Something<T>> map = new HashMap<String, Something<T>>();
public void add(final String key, final Something<? extends T> o) {
map.put(key, o); // <--- here
}
public Something<T> get(final String key) {
return map.get(key);
}
}
这种失败,因为你不能一个Something<? extends T>
添加到Map<X, Something<T>>
。因此,让我们改变这一点:
public static class ManagerImplementation<T> implements Manager<T> {
protected HashMap<String, Something<? extends T>> map = new HashMap<String, Something<? extends T>>();
public void add(final String key, final Something<? extends T> o) {
map.put(key, o);
}
public Something<T> get(final String key) {
return map.get(key); // <--- here
}
}
这将失败,因为map.get(key)
回报Something<? extends T>
而一开始的功能需要返回Something<T>
,如在接口中定义。
解决此问题的常用方法是什么?
谢谢!
为什么你不能改变get方法在界面上'公共的东西 extends T> GET(最终String键);'呢? –
@HariShankar这将返回'Something extends T>',所以OP将无法通过这样的引用(除'null')设置任何东西。 – Pshemo