所以這裏有一個稍微棘手的問題(對我來說)。可變泛型作爲值的Java地圖
我有一個通用的對象。稱它爲MyObject。這個對象有其返回類型T的一些方法:
public class MyObject<T>
{
private T _t;
public MyObject(T t)
{
_t = t;
}
//...
public T get()
{
return _t;
}
}
(顯然,我的「MyObject來」做多一點,但是這是要點)。
現在,我想有地圖這種類型的:
Map<String, MyObject<?>> m = new HashMap<>();
我希望能夠獲取使用一些預定義的字符串名稱的地圖,以及這些地圖可以是任何的MyObject的。例如,我可以打電話:
m.put("map_1", new MyObject<String>("String"));
m.put("map_2", new MyObject<Integer>(new Integer(3));
m.put("map_3", new MyObject<Long>(new Long(5));
等
但是 - 這裏是棘手的部分 - 我要地圖「記住」參數化類型爲MyObject,當我取回從地圖一定的價值。使用
m.get("map_1");
將返回
MyObject<Object>
類型中,由於地圖的定義爲含有
MyObject<?>
值。因此:
m.get("map_1").get() // <-- This is an Object, not a String!
什麼修改(如果有的話)是可能的,爲了能夠得到正確的 - 全 - 關於MyObject來獲取目標信息,從而調用的最後一行(m.get(「map_1 「))將返回一個
MyObject<String>
謝謝:)
阿米爾。
沒有什麼類型安全的,你可以在這裏做。 –
有一個設計實例,我認爲在Joshua Bloch的* Effective Java中可以滿足你的要求的異構類型 – markspace
反射怎麼樣? – calbertts