【发布时间】:2021-05-17 16:36:23
【问题描述】:
查看源代码时,我可以看到stream() 方法已在Collections.UnmodifiableMap.UnmodifiableEntrySet 中被覆盖。但代码似乎与Collection.stream() 相同,除了Collections.UnmodifiableMap.UnmodifiableEntrySet.stream() 中的返回类型更具体为Stream<Entry<K,V>> 而不仅仅是Stream<E>,如Collection.stream()。
spliterator() 方法在两个类中是不同的,但即使 stream 未被覆盖,我认为如果对象的类型为 UnmodifiableEntrySet,UnmodifiableEntrySet.spliterator() 将从 Collection.stream() 调用。
那么,stream 方法被覆盖有什么原因吗?
Collection.java
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
Collections.UnmodifiableMap.UnmodifiableEntrySet.java
@SuppressWarnings("unchecked")
public Spliterator<Entry<K,V>> spliterator() {
return new UnmodifiableEntrySetSpliterator<>(
(Spliterator<Map.Entry<K, V>>) c.spliterator());
}
@Override
public Stream<Entry<K,V>> stream() {
return StreamSupport.stream(spliterator(), false);
}
【问题讨论】:
-
只是因为
UnmodifiableEntrySet是一组Entry而Collection是通用的。我不确定是什么让您感到困惑。 -
@AniketSahrawat 是的。我的问题是,如果方法主体与
Collection.stream() -
@AniketSahrawat 经过一些调试,我在某种程度上找到了解决方案。
-
@GauthamM -
Stream<Entry<K,V>>不是Stream<E>。另一个例子是List<String>不是List<Object>。 -
我昨天误读了你的问题。如果您查看
stream的实现,您会注意到它已在 7 个地方被覆盖。相关覆盖位于UnmodifiableCollection中,然后又位于UnmodifiableEntrySet中。UnmodifiableCollection#stream基本上将调用委托给任何通过的Collection。如果UnmodifiableEntrySet中没有覆盖,则调用将委托给原始Collection(可变)。
标签: java oop collections java-stream overriding