Java 如何返回列表<;字符串>;从我发送的将(对象)放入映射的方法(示例)

Java 如何返回列表<;字符串>;从我发送的将(对象)放入映射的方法(示例),java,generics,list,object,map,Java,Generics,List,Object,Map,我有以下代码 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() : va

我有以下代码

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);
}
private Map values=new HashMap();
公共无效集(键、对象值){
value.put(键、值);
}
私有对象getObj(密钥){
返回值.get(key)=null?key.getDefaultValue():value.get(key);
}
公共列表getList(KEY){
返回(列表)getObj(键);
}
能够发送地图中的任何对象然后检索它的想法,但是我如何解决java中的genereics部分呢

下面是一个示例代码。在这里,我将列表保存到地图中:

    List<String> list = new ArrayList<String>();

    list.add("a string");

    session.set(KEY.LIST, list);
List List=new ArrayList();
添加(“字符串”);
session.set(KEY.LIST,LIST);
现在我想再次获取列表:

List<String> list = session.getList(KEY.LIST);
List List=session.getList(KEY.List);
但现在我得到了一份工作

cannot convert from List<E> to List<String>
无法从一个列表转换到另一个列表
由于明显的原因而导致的错误

是否可以从方法中获取列表(字符串),而不进行任何类型转换?这个方法正确吗

public List<E> getList(KEY key) {
    return (List<E>) getObj(key);
}
public List getList(KEY){
返回(列表)getObj(键);
}

您给出的强制类型转换将生成一个警告,因为它没有真正检查除
getObj
返回一个
列表之外的任何内容。事实上,没有任何东西可以真正有效地检查,因为在执行时,您将有一个
列表
,其中恰好包含字符串,但仅此而已


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

您给出的强制转换将生成一个警告,因为除了返回一个
列表
之外,它不会真正检查任何东西。事实上,没有任何东西可以真正有效地检查,因为在执行时,您将有一个
列表
,其中恰好包含字符串,但仅此而已


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

您无法解决该问题,因为。如果你绝对确定演员不会出错,那么你能做的最好的事情就是取消警告。

你无法解决这个问题,因为。如果您绝对确定演员阵容不会出错,那么最好是取消警告。

不要在会话中放置
列表,而是在应用程序域中引入一个有意义的类型。例如,不要使用
列表
,而是使用
顺序

public final class Order {
    private final List<LineItem> lineItems;
    [...]
}
公共最终课程顺序{
私人最终清单行项目;
[...]
}

与其在会话中放置
列表,不如在应用程序域中引入有意义的类型。例如,不要使用
列表
,而是使用
顺序

public final class Order {
    private final List<LineItem> lineItems;
    [...]
}
公共最终课程顺序{
私人最终清单行项目;
[...]
}

您可以尝试多重映射。每个键可以存储多个值。谷歌有一个很好的解决方案。Apache commons可能也有一个实现。

您可以尝试使用MultiMap。每个键可以存储多个值。谷歌有一个很好的解决方案。Apache commons可能也有一个实现。

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

你也有机会做一些类型检查

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

public List getList(KEY,Class克服类型擦除*的另一个选项是传递对返回中期望的对象类的引用

你也有机会做一些类型检查

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;
}
public List getList(键,类