泛型是不变的,但是编译没有错误
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);
}
- return类型是
Stream<Entry<E, Integer>>
- 本例程结束时流的类型是
Stream<SimpleImmutableEntry<E, Integer>>
形式类型参数E
有这样的定义:
<E extends Enum<E> & MyCustomInterface>
我不明白为什么这似乎可以被编译器接受。因为 Java 泛型是不变的,即使 java.util.AbstractMap.SimpleImmutableEntry
实现了 java.util.Map.Entry
,我会说 Stream<SimpleImmutableEntry<>>
不是 return 类型的子类型,Stream<Entry<>>
.
你犯了两个错误。第一个假设 SimpleImmutableEntry::new
是 Function<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>
。
*为简洁起见使用原始条目类型。
我收到类型不匹配错误,直到我将代码重构为:
public final Stream<Map.Entry<E, Integer>> orderedStreamOfEntries() {
return this.m_map.entrySet()
.stream()
.sorted(Comparator.comparingInt(Entry::getValue))
.map(AbstractMap.SimpleImmutableEntry::new);
}
- return类型是
Stream<Entry<E, Integer>>
- 本例程结束时流的类型是
Stream<SimpleImmutableEntry<E, Integer>>
形式类型参数E
有这样的定义:
<E extends Enum<E> & MyCustomInterface>
我不明白为什么这似乎可以被编译器接受。因为 Java 泛型是不变的,即使 java.util.AbstractMap.SimpleImmutableEntry
实现了 java.util.Map.Entry
,我会说 Stream<SimpleImmutableEntry<>>
不是 return 类型的子类型,Stream<Entry<>>
.
你犯了两个错误。第一个假设 SimpleImmutableEntry::new
是 Function<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>
。
*为简洁起见使用原始条目类型。