为什么在这里省略泛型类型参数是可以接受的?

时间:2016-08-17 17:44:36

标签: java java-8 java-stream

在以下代码段中:

public class IDMapBase<T> extends HashMap<DeviceID, T> {
    public Map<DeviceID, T> filterMap(Set<DeviceID> neededIDs) {
        return entrySet().stream()
            .filter(e -> neededIDs.contains(e.getKey()))
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
    }
}

为什么只说Entry::getXX而不是Entry<DeviceID, T>>::getXX就可以了? 我认为(Map.)Entry默认为Entry<Object, Object>,这不能用作Map<DeviceID, T>的条目。

1 个答案:

答案 0 :(得分:5)

您的输入参数具有足够的类型信息,编译器可以推断所有中间泛型类型。

它可以说“进来的东西”和“出来的东西”......以及“介于两者之间的步骤”匹配。

示例:第一个调用是 entrySet();所以周围的类可能是一个定义了K,V的Map。所以编译器知道它正在处理一些EntrySet<K,V> ...可能与neededIDs上的泛型类型相匹配。

等等......如果你对自己“推断”这些类型感兴趣;我建议你首先分解那些流畅链接的方法调用。逐一;计算他们返回的内容,以及您可以了解的每项操作的结果类型。