2

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

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

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

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

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

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

4

2 回答 2

3

听起来您想要以下内容:

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

更多信息:

于 2013-03-21T01:07:57.660 回答
0

我认为这取决于。

泛型被设计并适用于一些场景,其中客户端代码和服务代码紧密收缩,用于强类型传输和评估。所以泛型在这种情况下只是为我们提供了预编译时安全性,但是当客户端代码对错误的类型进行愚蠢的转换并将它们输入到泛型集合时,它并不是绝对安全和方便的。正如我们所知,colleciton 在运行时会崩溃,但在编译时是可以的。

泛型在某些情况下是不合适的,在这种情况下,我们自己可以保证我们添加到泛型集合中的一些对象是正确的,即使它们不能统一或强制转换为一个超类强类型。在这种情况下,我们可以通过使用原始类型集合或使用一些集合(如List<Object>. 这是正确的方法。 我想你可能就是这种情况

于 2013-03-21T04:53:05.947 回答