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>, Something<Double>, ... 添加到 a 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);
    }
}

这失败了,因为您不能将 a 添加Something<? extends T>到 a 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 时返回map.get(key),如接口中定义的那样。Something<? extends T>Something<T>

解决这个问题的常用方法是什么?

谢谢!

4

1 回答 1

3

在您的班级内部,您总是在使用Something<? extends T>,因此在您的public get方法中,您必须将内部世界转换为外部世界格式。例如,您可以简单地将结果map.get(key)转换为Something<T>

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