6

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>

これを解決するための一般的なアプローチは何ですか?

ありがとう!

4

1 に答える 1

3

クラス内では常に を使用しているSomething<? extends T>ため、public getメソッドでは、内側の世界を外側の世界の形式に変換する必要があります。map.get(key)たとえば、単にtoの結果をキャストできますSomething<T>:

return (Something<T>) map.get(key); // <--- here
于 2013-10-08T09:39:43.913 に答える