[英]Java - generics & wildcards & interface versus implementation
我有一個關於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>
。 我會說我必須更改add-function的簽名:
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>
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<? extends T>
而get-function需要返回Something<T>
,如界面中定義的那樣。
解決這個問題的常用方法是什么?
謝謝!
在課堂上你總是使用Something<? extends T>
Something<? extends T>
,因此在您的public get
方法中,您必須將內部世界轉換為外部世界格式。 例如,您可以簡單地將map.get(key)
的結果map.get(key)
為Something<T>
:
return (Something<T>) map.get(key); // <--- here
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.