如何返回List< String>从我发送到put(Object)到地图的方法(获得示例)

StackOverflow https://stackoverflow.com/questions/1422448

我有以下代码

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:

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);
}
有帮助吗?

解决方案

克服类型擦除*的另一个选择是传递对返回时期望的对象类的引用。

您还有机会进行类型检查。

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);

*至少克服了方法声明中的类型擦除。你仍然需要在方法体中进行一些转换。

其他提示

由于键入删除,您无法解决此问题。如果您绝对确定演员阵容不会出错,那么您所能做的最好就是压制警告。

你给出的演员会产生一个警告,因为除了 getObj 之外, 实际上,由于 无法真正有效地检查“> 类型擦除 - 在执行时,您将有一个 List ,它恰好包含字符串,但这就是全部。

你当然可以检查列表中的所有内容是一个字符串(或null),但这是一个O(n)操作。或者你可以做演员,抑制警告并希望......在这种情况下,只有当你点击非字符串时才会得到异常。

您可以尝试使用MultiMap。您可以为每个键存储多个值。 Google有一个实施 。 Apache commons也可能有一个实现。

不要在会话中放置 List ,而是在应用程序域中引入一个有意义的类型。例如,使用 Order 代替 List&lt; LineItem&gt;

public final class Order {
    private final List<LineItem> lineItems;
    [...]
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top