gpt4 book ai didi

Scala:为什么 PECS 原则不适用于 Function1?

转载 作者:行者123 更新时间:2023-12-04 17:40:19 30 4
gpt4 key购买 nike

在 Effective Java 中,Joshua Bloch 讨论了 PECS(Producer-Extends,Consumer-Super)的原理。

我对此的理解是,为了提高 API 的灵活性,输入(产生的集合)应该是协变的,而输出(消耗的集合)应该是逆变的。

实现此原则的函数可以具有以下签名:

private static void func( ArrayList<? extends Object> input, ArrayList<? super Integer> output)

但是,在 Scala 中,Function1 trait 具有以下签名:
trait Function1[-T1, +R] extends AnyRef

T1(输入类型)是逆变的,而 R(输出类型)是协变的。

我的理解正确吗?如果是这样,为什么 Scala 的 Function1 trait 中没有应用 PECS?

最佳答案

Joshua 是对的,Scala 也是。事实上,Scala 强制执行此规则,因此您无需担心。 Java,因为它没有变化注释并且必须在调用站点处理存在性,所以需要它们来指导程序员进行正确的设计。

Scala 在定义点有差异注解,而 java 在调用点有存在性注解。调用的输出是定义的输入,反之亦然。

A Function1不是从其参数中读取,也不是写入其结果,这就是 reduce以约书亚为例。相反,您必须考虑 Function1作为一个集合。

当您写入一个集合时,该集合是一个使用者。类似于函数:当你调用它时,你正在写入它。因此,正在写入的输入参数必须是逆变的。

同样,当您从一个集合中读取时,该集合就是一个生产者。您通过查看其结果来读取函数,因此输出参数必须是协变的。

如您所见,这正是 Function1符号。

关于Scala:为什么 PECS 原则不适用于 Function1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11272819/

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