与えられた:
class Invar[T]
trait ExtendsAnyref extends AnyRef
def f(a: Invar[ExtendsAnyref]) = {}
以下は誤りです
scala> val x: Function1[Invar[_ <: AnyRef], Unit] = f
<console>:13: error: type mismatch;
found : Invar[ExtendsAnyref] => Unit
required: Invar[_ <: AnyRef] => Unit
val x: Function1[Invar[_ <: AnyRef], Unit] = f
^
なんで?
Scala では、ジェネリック型にはデフォルトで非バリアント サブタイプがあることを理解しています。したがって、この例のコンテキストではInvar
、異なる型パラメーターを持つ のインスタンスが互いにサブタイプの関係になることはありません。したがって、Invar[ExtendsAnyref]
は として使用できませんInvar[AnyRef]
。
しかし、「型階層の _ <: AnyRef
下にある型」を意味すると理解した意味について混乱しています。は型階層の下にある型なので、に準拠することが期待されます。AnyRef
ExtendsAnyref
AnyRef
Invar[ExtendsAnyref]
Invar[_ <: AnyRef]
関数オブジェクトは入力パラメーターの型が反変であることは理解していますが、明らかに間違って理解したのでInvar[_ <: AnyRef]
はなくInvar[AnyRef]
使用しているため、上限の使用には「Invar
パラメーター化Anyref
またはその拡張」という意味があります。
私は何が欠けていますか?