Bar[MyModel[_]]
是 Bar[MyModel[X] forSome {type X}]
。
(不应与Bar[MyModel[X]] forSome {type X}
或混淆Bar[MyModel[X forSome {type X}]]
,后者只是 Bar[MyModel[Any]]
。这是三种不同的类型。)
Bar[MyModel[X] forSome {type X}]
(aka Bar[MyModel[_]]
) 无法编译,因为MyModel[X] forSome {type X}
(aka MyModel[_]
) 不满足Bar
'condition TModel <: Model[TModel]
。确实,您可以检查
implicitly[(MyModel[X] forSome {type X}) <:< Model[MyModel[X] forSome {type X}]]
不编译(X
从左到右<:<
不X
相关<:<
)。问题是左侧存在类型的skolemization ,MyModel[X] forSome {type X}
即MyModel[X1]
不连接到Model[MyModel[X] forSome {type X}]
右侧,对于不变量Model
(由此class MyModel[T] extends Model[MyModel[T]]
得出MyModel[X1] <: Model[MyModel[X1]]
(1),也是MyModel[X1] <: (MyModel[X] forSome {type X})
(2),但对于不变量,Model
我们不能应用于Model
后者“不等式”)。
但是,如果您使Model
协变abstract class Model[+M <: Model[M]]
,那么我们可以应用于Model
“不等式”(2),因此Model[MyModel[X1]] <: Model[MyModel[X] forSome {type X}]
,这与(1)一起MyModel[X1] <: Model[MyModel[X] forSome {type X}]
通过传递性给出。满足soBar
的条件并new Bar[MyModel[_]]
编译。
Bar[MyModel[Any]]
MyModel[Any]
因为满足Bar
条件所以编译TModel <: Model[TModel]
。确实MyModel[Any] <: Model[MyModel[Any]]
是因为class MyModel[T] extends Model[MyModel[T]]
(你可以检查一下
implicitly[MyModel[Any] <:< Model[MyModel[Any]]]
编译)。