java - 使用泛型将集合添加到 HashMap

标签 java generics

我收到了大量扩展我的对象的对象数组列表。我想将它们插入到 HashMap 中以便更快地引用。我决定创建一种方法来避免重复代码,因为这种情况经常发生,并且只是为了好玩,我想变得更加花哨并使用泛型。我知道有几种方法可以做到这一点,但没有一种看起来很干净或漂亮;我想知道我是否缺少一个更简单的解决方案。所以我想做这样的事情......

private void addToMap(Collections<? extends myObject> collection, Map<String, ? extends myObject> map){

  for(MyObject myObject: collection){
    map.put(myObject.getName(), myObject);
  }
}

该方法的契约要求提供的集合存储与映射相同的类。如果该方法抛出异常,如果有人违反该契约(Contract)并尝试传入两个存储 myObject 的不同实现的集合,然后存储 map ,我很好。

上面的代码失败了,因为我无法将“myObject”放入期望“?extends MyObject”的集合中以鼓励类型安全。我只是转换它就可以了,但他们是我知道如何转换它的唯一方法,涉及到一些丑陋的反射(reflection)步骤,而且看起来很复杂。我还可以创建某种内部类来提供更强大的泛型(强制集合和映射存储相同的类型),但这也感觉有点矫枉过正。

那么,是否有一种简单或漂亮的方式来以对读者最直观的方式创建此方法?我知道我可以完全抛弃泛型,只从对象中转换所有内容,我只是想找出一种更优雅的方法。

最佳答案

听起来您想要以下内容:

private <T extends MyObject> void addToMap(
        Collection<T> collection,
        Map<String, ? super T> map
) {
    for (T myObject : collection) {
        map.put(myObject.getName(), myObject);
    }
}

更多信息:

关于java - 使用泛型将集合添加到 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15537665/

相关文章:

时间:2019-03-08 标签:c++typedefgenerics

java - Android 查找缺失号码

java - C++ 中传递的函数参数与 Java 中传递的函数参数

java - 下界通配符(Comparable<?super K>)

java - Number 操作的通用类

从 NSObject 继承时,不会调用泛型中使用的 swift 子类

java - OpenGL 未按预期渲染

java - 返回查询 SELECT 语句

java - GLFW (LWJGL) 输入 - 按住 CTRL 会阻止 CharCallback

c# - 如何实现可以返回类或可空结构的通用集合查找方法?