【问题标题】:Generic with question mark通用带问号
【发布时间】:2021-07-09 19:25:05
【问题描述】:

如何构造Collection<Map<String, ?>>的实例?

// works:
Collection<?> collection = new ArrayList<Object>();
ArrayList<?> arrayList = new ArrayList<Object>();

Map<String, ?> map = new HashMap<String, Object>();
HashMap<String, ?> hashMap = new HashMap<String, Object>();

Collection<Map<String, Object>> collectionOfMaps = new ArrayList<Map<String, Object>>();
ArrayList<HashMap<String, Object>> arrayListOfHashMaps = new ArrayList<HashMap<String, Object>>();

// error:
ArrayList<HashMap<String, ?>> arrayListOfHashMapsWithQuestionMark = new ArrayList<HashMap<String, Object>>();

最后一行没有编译并出现以下错误:

incompatible types: java.util.ArrayList&lt;java.util.HashMap&lt;java.lang.String,java.lang.Object&gt;&gt; cannot be converted to java.util.ArrayList&lt;java.util.HashMap&lt;java.lang.String,?&gt;&gt;

为什么arrayListOfHashMapsWithQuestionMark Object 对问号类型无效?

【问题讨论】:

标签: java generics collections


【解决方案1】:

你需要ArrayList&lt;? extends HashMap&lt;String, ?&gt;&gt;

正如所有其他示例所展示的那样,例如HashMap&lt;String, Object&gt;HashMap&lt;String, ?&gt;子类型

【讨论】:

  • 我想用ArrayList&lt;HashMap&lt;String, ?&gt;&gt;参数调用方法,所以我不能改变签名,需要构造这种类型的实例。
  • 为什么不直接做new ArrayList&lt;HashMap&lt;String, ?&gt;&gt;()
  • @TrevorKropp 它可以工作,但将整个列表复制到新的 ArrayList 实例
  • 一种解决方法是将 ArrayList&lt;HashMap&lt;String, Object&gt;&gt; 从答案中转换为您需要的类型。然后,您可以对方法签名指示的类型进行未经检查的强制转换。
  • @Silence 为什么使用new ArrayList&lt;HashMap&lt;String, ?&gt;&gt;() 而不是new ArrayList&lt;HashMap&lt;String, Object&gt;&gt;() 需要“复制整个列表”?这句话毫无意义。
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 2016-08-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多