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>
また、 a に, 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>
ます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
}
}
インターフェイスで定義されているように、 get-function が return を要求されている間に return が返されるため、map.get(key)
これは失敗します。Something<? extends T>
Something<T>
これを解決するための一般的なアプローチは何ですか?
ありがとう!