2

我收到类型不匹配错误,直到我将代码重构为:

    public final Stream<Map.Entry<E, Integer>> orderedStreamOfEntries() {
        return this.m_map.entrySet()
                .stream()
                .sorted(Comparator.comparingInt(Entry::getValue))
                .map(AbstractMap.SimpleImmutableEntry::new);            
    }
  • 返回类型是Stream<Entry<E, Integer>>
  • 该例程结束时的流类型是Stream<SimpleImmutableEntry<E, Integer>>

正式类型参数E有这样的定义:

<E extends Enum<E> & MyCustomInterface>

我不明白为什么编译器似乎可以接受。因为 Java 泛型是不变的,即使java.util.AbstractMap.SimpleImmutableEntryimplements java.util.Map.Entry,我也会说它Stream<SimpleImmutableEntry<>>不是返回类型的子类型,Stream<Entry<>>.

4

1 回答 1

2

你犯了两个错误。第一个假设SimpleImmutableEntry::new是一个Function<Entry, SimpleImmutableEntry>*,而实际上它可以解释为Function<Entry, Entry>恰好返回a 的 a SimpleImmutableEntry

其次,查看签名map()

<R> Stream<R> map(Function<? super T, ? extends R> mapper)

通过返回? extends R,该方法可以自由地解释R为lambdas 返回类型的超类Function<Entry, SimpleImmutableEntry>,这意味着即使 a也可能导致 a Stream<Entry>,甚至Stream<Object>

实际解释取决于推断的返回类型,在您的情况下是Stream<Entry>.

*为简洁起见,使用原始条目类型。

于 2017-07-27T17:32:03.123 回答