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

Geo*_*Geo 0 java generics collections

我已经阅读了关于Java集合的Google Collections,Guava和静态导入文章的Beautiful代码,下面的代码片段引起了我的注意:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*vin 6

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

public static <K, V> HashMap<K, V> newHashMap() {
    return new HashMap<K, V>();
}
Run Code Online (Sandbox Code Playgroud)

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