【问题标题】:Generic map in javajava中的通用地图
【发布时间】:2012-07-23 19:51:40
【问题描述】:

我有一个方法需要参数中的通用映射:

public void someMethod(Map<String,?> mapParameter){
    ...
}

调用此方法的我的实现对“?”有多个可能的值通用参数。例如,有时“?”中的值将是整数,其他将是字符串,布尔值。

存在某种方式来声明一个可以接受我的值并传递给“someMethod”方法的完全通用的 HashMap 吗?

我尝试将值提取到“IntegerValueDTO”类,接收字符串值中的值并转换为特定类型。创建的所有这些“valueDTO”类,我都从“defaultValue”扩展。 有了这个,我实现了这张地图:

Map<String, ? extends DefaultValue> map = new HashMap<String, ? extends DefaultValue>();

但是,方法 someMethod 不是来自我的应用程序,它来自框架,那么我无法控制实现。并以这种方式声明我的地图,他将生成"Map&lt;String, some instance of DefaultValue&gt;" 的地图,框架崩溃。

欢迎任何帮助。

【问题讨论】:

  • 我不太明白这个问题。有你描述的这种方法。你想调用它。问题是什么?您应该可以使用Map&lt;String, ?&gt;Map&lt;String, Foo&gt;Map&lt;String, ? extends Foo&gt; 调用它。问题是编写可编译的东西还是运行的东西?
  • 不要不要在问题标题中加入“已解决”。如果您有答案,请发布答案并接受。我已经回滚了你的编辑。请提交答案。

标签: java generics map hashmap


【解决方案1】:
Map<String, ? extends Object> map = new HashMap<String, ? extends Object>();

如果该方法返回一些您希望在应用程序中使用的值,您可以使用反射来查看它返回的值并强制转换为该特定对象。

【讨论】:

  • @Tom:你是对的。我们必须声明该类型的变量并根据传递给该方法的参数类型对其进行实例化。例如:new HashMap&lt;String, Integer&gt;();。 @Raduq Santos:不过我不太明白这个问题。您说您想将Map 作为参数传递,但您也将值提取到DTOs。你到底想达到什么目的?
  • 我正在尝试创建一个完全 gereric 的地图,它可以存储字符串、整数或布尔值,但不能创建对象。我认为这在我的结构中是不可能的。
【解决方案2】:

如果没有像 Def​​aultValue 这样的 Wrapper 类,您将无法做到这一点。

原因是 Integer、Character、Long 等的 Wrapper 类没有扩展 Object。

【讨论】:

  • 我的意思是你不能写扩展对象,但你可以像这样 Map 而不是 Map
  • 可以声明Map&lt;String,? extends Object&gt;。您不能实例化或扩展它,但可以声明该类型的变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多