【问题标题】:Map<String, List<? extends AbstractType>>地图<字符串,列表<?扩展抽象类型>>
【发布时间】:2016-06-08 10:05:51
【问题描述】:

我一直在寻找 Stack Overflow,但我不知道这是否可能,但这是我的问题:

我有两种类型 ABAbstractType 扩展, 然后我想要一个Map,里面有两种类型的对象:

Map<String,List<? extends AbstractType>> map = new HashMap();
map.put("toto",new Arraylist<A>);
map.put("sacha",new Arraylist<B>);
List<A> a = (List<A>)map.get("toto");

我有一个完全可以理解的安全警告,但这是我发现完成这项工作的最佳方式。

我发现的唯一安全选项是有两个不同的列表,但我更喜欢映射以避免多个 if 情况。

我希望有人会有想法。

【问题讨论】:

  • 你怎么知道map.get("toto")List&lt;A&gt; 而不是List&lt;B&gt;List&lt;C&gt;
  • 为什么不创建相应的 POJO 并根据需要覆盖 hashCode 和 equals 方法并保留一个 Set
  • 请详细说明“multiple if case”的想法。你知道“toto”自动意味着List&lt;A&gt;吗?或者您是否需要测试 map 中的值以确定它是 A 还是 B 品种?
  • 是的,我知道编译器不知道返回类型是 A 或 B 或 C 的列表。但对我来说,当我从代码的一部分调用该方法时,我知道返回类型是 A 的列表,另一部分是 B 的列表。
  • 这就是为什么我不明白您所说的“多个 if case”是什么意思。既然你已经知道了,你需要做什么样的“如果”?

标签: java list generics dictionary


【解决方案1】:

您也可以使用instanceof 来确保您不会遇到麻烦。这是一个示例,您可以根据需要进行修改:

Map<String,List<? extends AbstractType>> map = new HashMap<>();
        map.put("toto",new ArrayList<A>());
        map.put("sacha",new ArrayList<B>());

        List<? extends AbstractType> objList = (List<? extends AbstractType>) map.get("toto");
        List<A> a = null;
        List<B> b = null; 
        if(objList.size() > 0 && objList.get(0) instanceof A){
            a = (List<A>) objList;
        }else if (objList.size() > 0 && objList.get(0) instanceof B){
            b = (List<B>) objList;
        }

希望这会有所帮助!

【讨论】:

  • 存在支票! :)
  • 正确,但如果List 为空,则无需检查。 ab 都将是 null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多