这个代码示例是否真的返回了正确的参数化类型?

时间:2009-10-16 17:18:23

标签: java generics collections

我已阅读有关Java集合的Beautiful code with Google Collections, Guava and static imports文章,以下片段引起了我的注意:

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

问题是,我不明白newHashMap方法可能如何返回Map<String,Map<Long, List<String>>>。他们是怎么写这段代码的?什么时候成为可能?我的印象是你需要在构造函数调用中显式声明泛型参数。

2 个答案:

答案 0 :(得分:6)

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

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

你会看到它声明了两个通用参数K和V,并将结果声明为Map。编译器足够聪明,可以从LHS表达式中找出K和V.在您的情况下,K为String,V为Map<Long, List<String>>

答案 1 :(得分:1)

看看来源。所有这个方法都提供了一个很好的捷径:

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

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