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

3VY*_*z7t 1 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么简单地说Entry::getXX而不是Entry<DeviceID, T>>::getXX?我认为这(Map.)Entry将默认为Entry<Object, Object>,它不能用作a的条目Map<DeviceID, T>.

Gho*_*ica 5

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

它可以看出"什么进来"和"什么出来"......和"介于两者之间"的步骤相匹配.

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

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