在 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(输出类型)是协变的。
我的理解正确吗?如果是这样,为什么 PECS 没有应用于 Scala 的 Function1 特征?