繁体   English   中英

理解类型 arguments do not conform to class type parameter bounds error when using Higher kinded type parameter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM