効果的な Java で、Joshua Bloch は PECS (Producer-Extends、Consumer-Super) の原則について説明しています。
これについての私の理解では、API の柔軟性を高めるには、入力 (生成するコレクション) を共変にし、出力 (消費するコレクション) を反変にする必要があります。
この原則を実装する関数は、次のシグネチャを持つことができます。
private static void func( ArrayList<? extends Object> input, ArrayList<? super Integer> output)
ただし、Scala では、 Function1 トレイトには次のシグネチャがあります。
trait Function1[-T1, +R] extends AnyRef
T1 (入力型) は反変ですが、R (出力型) は共変です。
私の理解は正しいですか?もしそうなら、PECS が Scala の Function1 トレイトに適用されないのはなぜですか?