[英]Understanding type arguments do not conform to class type parameter bounds error when using Higher kinded type parameter
我试图理解为什么当我在 MyModel 中为 T 使用更高种类的类型参数时,以下代码将无法编译
abstract class Model[M <: Model[M]]
class MyModel[T] extends Model[MyModel[T]]
class Bar[TModel <: Model[TModel]]
object Foo extends App {
new Bar[MyModel[_]]
}
但是,如果我将其更改为new Bar[MyModel[Any]]
它将编译。 为什么是这样?
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}]
(又名Bar[MyModel[_]]
)无法编译,因为MyModel[X] forSome {type X}
(又名MyModel[_]
)不满足Bar
的条件TModel <: Model[TModel]
。 确实,您可以检查
implicitly[(MyModel[X] forSome {type X}) <:< Model[MyModel[X] forSome {type X}]]
不编译(从<:<
到左侧的X
和从<:<
:< 到右侧的X
不相关)。 问题是左侧MyModel MyModel[X] forSome {type X}
的存在类型的 skolemization ,即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
协变抽象Model[MyModel[X1]] <: Model[MyModel[X] forSome {type X}]
abstract class Model[+M <: Model[M]]
那么我们可以将Model
应用于 "inequality" (2) Model[MyModel[X1]] <: Model[MyModel[X] forSome {type X}]
这与 (1) 一起通过传递性给出了MyModel[X1] <: Model[MyModel[X] forSome {type X}]
。 所以Bar
的条件得到满足并且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]]]
编译)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.