[英]My Hashmap object value list object return only last object i was put in ArrayList<Map<String,Object>>>();
[英]How do I return List<String> from a method where I sent to put(Object) into a map (got example)
我有以下代碼
private Map<KEY, Object> values = new HashMap<KEY, Object>();
public void set(KEY key, Object value) {
values.put(key, value);
}
private Object getObj(KEY key) {
return values.get(key) == null ? key.getDefaultValue() : values.get(key);
}
public List<E> getList(KEY key) {
return (List<E>) getObj(key);
}
能夠在地圖中發送任何對象然后進行檢索的想法,但是我該如何解決java中的genereics-part?
這是示例代碼。 在這里,我將列表保存到地圖中:
List<String> list = new ArrayList<String>();
list.add("a string");
session.set(KEY.LIST, list);
現在,我想再次獲取列表:
List<String> list = session.getList(KEY.LIST);
但是現在我得到了
cannot convert from List<E> to List<String>
錯誤的原因很明顯。
是否可以從方法中獲取List(String),而無需進行任何類型轉換? 這種方法正確嗎?
public List<E> getList(KEY key) {
return (List<E>) getObj(key);
}
您提供的強制轉換將生成警告,因為除了getObj
返回List
之外,它實際上沒有檢查其他任何內容。 實際上,由於類型擦除 ,您無法真正有效地進行檢查-在執行時,您將擁有一個恰好包含字符串的List
,僅此而已。
您當然可以檢查列表中的所有內容是否都是字符串(或null),但這是O(n)操作。 或者,您可以只進行強制轉換,取消警告和希望……在這種情況下,只有當您擊中非字符串時,您才會獲得異常。
由於類型擦除 ,您無法解決該問題。 如果您絕對確定強制轉換不會出錯,則最好的辦法就是取消警告。
您可以嘗試MultiMap。 您可以為每個鍵存儲多個值。 Google有一個實現 。 Apache Commons也可能有一個實現。
而不是在會話中添加List
,而是引入在應用程序域中有意義的類型。 例如不是List<LineItem>
中,使用Order
:
public final class Order {
private final List<LineItem> lineItems;
[...]
}
克服類型擦除*的另一種選擇是將引用傳遞給您期望返回的對象類。
您還將有機會進行一些類型檢查。
public <E> List<E> getList(KEY key, Class<? extends E> elementClass)
{
Object o = getObj(key);
if ( ! (o instanceof List) ) throw new RuntimeException("Not a list value");
List l = (List)o;
if ( l.size() > 0 && !elementClass.isAssignableFrom( l.get(0) ) ) throw new RuntimeException("List element not valid type");
return (List<E>)l;
}
您將這樣稱呼:
List<String> list = session.getList(KEY.LIST, String.class);
*至少要克服方法聲明中的類型擦除。 您仍然必須在方法主體中進行一些轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.