我有一個關於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