簡體   English   中英

Java - 泛型和通配符以及接口與實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM