2013-03-21 62 views
2

我正在接收大量的扩展我的对象的对象的数组列表。我想将它们插入散列表中以加快参考。我决定创建一种避免重复代码的方法,因为它经常发生,并且只是为了好玩,我希望变得更加花哨,并使用泛型。我知道有几种方法可以做到这一点,但没有一个看起来很干净或漂亮。我想知道如果我错过了一个更简单的解决方案。所以,我想要做这样的事情...使用泛型向hashmap添加集合

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

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

方法的合同将要求集合作为地图将会提供存储相同的类。我很好,如果方法抛出一个异常是有人打破该合同,并尝试传入两个存储myObject的不同实现,然后存储地图的集合。

上面的代码失败了,因为我不能将'myObject'放入期望“?extends MyObject”来鼓励类型安全的集合中。我很好,只是投了它,但他们只知道如何投射它,涉及到几个难看的反射步骤,似乎令人费解。我也可以创建某种内部类来让我可以使用更强大的泛型(强制收集和映射以存储相同类型),但它也感觉过度杀伤。

那么,是否有一种简单或漂亮的方式以最直观的方式创建此方法?我知道我可以完全抛弃泛型,只是抛出一切东西,我只是想弄清楚一个更优雅的方法。

+4

应该?扩展myObject'而不是'?扩展MyObject'? – 2013-03-21 01:06:32

+0

@RichardJPLeGuen:不是,它应该是'?超级MyObject“。 – 2013-03-21 02:11:54

回答

3

这听起来像你想以下几点:

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

更多信息:

+0

如果你想让这个解决方案更加灵活,你可以使用'Collection '。 – Jeffrey 2013-03-21 01:09:17

+0

@Jeffrey我认为,但它不会给调用者增加更多的灵活性,因为它已经决定了'T'。感谢编辑顺便说一句。 – 2013-03-21 01:10:51

+0

@Jeffrey你删除你的答案的任何理由?我正要放弃我的并且赞成它。 – 2013-03-21 01:12:12

0

我认为这取决于。

泛型被设计和适合于某些senarios,其中,所述客户端代码和服务代码被紧紧地收缩为四通型换乘评价。所以泛型只是为我们提供了预编译时安全在这种情况下当客户端代码做一个愚蠢的铸造一个错误的类型,并输入他们Genrics收集也并非绝对安全,方便。正如我们所知,集合在运行时会崩溃,但在编译时可以。

泛型适合在某些情况下,这我们自己可以保证一些对象,并将它们加入泛型集合是正确的,他们甚至不能unifed或浇铸到一个超强力式。在这种情况下,我们可以通过使用原始类型集合或使用一些集合(如List<Object>)来忽略泛型。这是正确的路要走。 我想你可能是在这种情况下