gpt4 book ai didi

java - Java 8 中原始特化的不一致

转载 作者:搜寻专家 更新时间:2023-10-31 20:32:33 25 4
gpt4 key购买 nike

为什么 PrimitiveIterator.OfInt扩展 Iterator<Integer>但是IntStream不扩展 Stream<Integer>

我正在尝试设计一个原始集合类型(类似于 Apache Commons Primitives 库 ( http://commons.apache.org/dormant/commons-primitives/ ) 的接口(interface),并试图与集合库保持一致和兼容,但我无法决定我是否应该让我的 ByteList 扩展 List<Byte> 或不。

我猜这是因为 Iterator在语言中有直接的语法支持(即使用迭代器的循环)所以值得使迭代器与该语法兼容,即使它强制装箱,但我很好奇是否有人知道是否有更深层次的原因。谢谢!

最佳答案

很难说出为什么 JDK API 是这样设计的,但在这种情况下,我们可以很容易地看出试图制作 Stream<Integer> 的 API。和 IntStream很难一起工作,因为两个接口(interface)的方法定义中存在许多歧义。

考虑以下几点:

interface Stream<T> {
Stream<T> distinct();
Optional<T> findFirst();
}

interface IntStream extends Stream<Integer> {
IntStream distinct();
OptionalInt findFirst();
}

第二个接口(interface)不会编译事件,因为方法的签名相同,但返回类型在第二个接口(interface)中不同。

当我们提供接受 lambda 的同一方法的多个实现时,即使是兼容的方法也可能变得难以使用。 Lambda 和方法重载通常不能很好地结合使用,因为给定的 lambda 可能实现多个功能接口(interface)。例如:

interface Stream<T> {
Stream<T> filter(Predicate<T> p);
<S> Stream<S> map(Function<T,S> mapper);
}

interface IntStream extends Stream<Integer> {
IntStream filter(IntPredicate p);
IntStream map(IntUnaryOperator mapper);
}

现在,如果您有类似 stream.filter(n -> n > 10) 的调用这个 lambda 实际上可以同时实现 Predicate<Integer>IntPredicate现在 API 用户被迫进行某种消歧,例如(int n) -> n > 10 ,因为编译器无法区分。

我想,从长远来看,这可能会阻碍 Stream 的发展。和 IntStream API。

关于java - Java 8 中原始特化的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40208360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com