2009-10-16 64 views
0

我读过Beautiful code with Google Collections, Guava and static imports文章关于Java集合,和下面的代码片段了我的注意:这个代码示例是否真的返回正确的参数化类型?

Map<String, Map<Long, List<String>>> map = Maps.newHashMap(); 

的事情是,我不明白它是如何可能的newHashMap方法可以返回一个Map<String,Map<Long, List<String>>>。他们是如何编写这些代码的?什么时候成为可能?我的印象是,您需要在构造函数调用中显式声明泛型参数。

回答

6

您可以在方法调用上声明泛型参数,而不仅仅是整个类。如果你看一下源为该方法:

public static <K, V> HashMap<K, V> newHashMap() { 
    return new HashMap<K, V>(); 
} 

你会看到它声明两个泛型参数,K和V,并宣布的结果是一个地图。编译器足够聪明,可以从LHS表达式中找出K和V.在你的情况下,K是String和V是Map<Long, List<String>>

+0

这是“找出”新的东西吗?还是一直在这里? – Geo 2009-10-16 17:25:17

+0

+1表示我的英文意思是什么 – ChssPly76 2009-10-16 17:25:18

+1

@Geo Java 5中的“新”。我不确定你的意思。 – Kevin 2009-10-16 17:26:28

1

看看源代码。所有这种方法提供了一个很好的捷径:

public static <K, V> HashMap<K, V> newHashMap() { 
    return new HashMap<K, V>(); 
} 

这将适用于任何参数,因为HashMap本身是通用的。

+0

是的,它提供了一个捷径。但为什么不是'Map​​map = Maps.newHashMap​​'? – Geo 2009-10-16 17:22:07

+0

@Geo - 我不明白你的意思是你的意见 – ChssPly76 2009-10-16 17:22:53

+0

说这个例子:'ArrayList list = new ArrayList ()'。编写ArrayList list = new ArrayList()'是否合法?我记得需要明确提到等号两边的参数。 – Geo 2009-10-16 17:24:44

相关问题