簡體   English   中英

我如何退貨清單 <String> 從我發送到put(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.

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