Javaジェネリックに関する質問があります。私はまた、Something<Double>
、Something<Integer>
を追加できるようにしたいと思いJava - ジェネリックスとワイルドカードとインターフェイスの実装
final Manager<Number> m = ...;
m.add("key", new Something<Number>());
m.get("key").set(new Integer(5));
... Manager<Number>
へ:利用
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);
}
例:私は次のインタフェースを持っていると言います。私は、追加機能のシグネチャを変更する必要があると言います。
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);
}
}
これは失敗し、あなたがMap<X, Something<T>>
にSomething<? extends T>
を追加することができないので。それでは、これを変更してみましょう:GET-機能がインターフェイスで定義されているように、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>
ので、失敗しました。
これを解決する一般的な方法は何ですか?
ありがとうございます!
なぜあなたは '公共何か extends T>のget(最終文字列のキー)へのインターフェースでgetメソッドを変更することはできません;'だけでなく? –
@HariShankarこれは 'Something extends T>'を返すので、OPはそのような参照( 'null'を除く)を介して何も設定することができません。 – Pshemo