泛型是不变的,但是编译没有错误

Generics are invariant, but this compiles without error

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

    public final Stream<Map.Entry<E, Integer>> orderedStreamOfEntries() {
        return this.m_map.entrySet()
                .stream()
                .sorted(Comparator.comparingInt(Entry::getValue))
                .map(AbstractMap.SimpleImmutableEntry::new);            
    }

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

<E extends Enum<E> & MyCustomInterface>

我不明白为什么这似乎可以被编译器接受。因为 Java 泛型是不变的,即使 java.util.AbstractMap.SimpleImmutableEntry 实现了 java.util.Map.Entry,我会说 Stream<SimpleImmutableEntry<>> 不是 return 类型的子类型,Stream<Entry<>>.

你犯了两个错误。第一个假设 SimpleImmutableEntry::newFunction<Entry, SimpleImmutableEntry>*,而实际上它可以解释为 Function<Entry, Entry> 恰好 return SimpleImmutableEntry.

其次,查看map()的签名:

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

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

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

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