如何返回List< String>从我发送到put(Object)到地图的方法(获得示例)
题
我有以下代码
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;
[...]
}
不隶属于 StackOverflow