正确的一个是
trait StaticRoles { this: (Databases[F] forSome { type F[_] }) => }
Scala 中是否有类型变量 'm forSome { type m[O] https://stackoverflow.com/questions/61041172/is-there-a-shorthand-for-type-variable-m-forsome-type-mo-upperboundo
并非所有存在类型都可以用下划线表示或(在本例中)允许用下划线表示。
还有
trait StaticRoles { this: Databases[F forSome { type F[_] }] => }
与前者不同但相同
trait StaticRoles { this: Databases[Any] => }
since
implicitly[(Databases[F forSome { type F[_] }]) =:= Databases[Any]]
(Any
实际上是多种类的)。
Databases[Any]
是一个子类型Databases[F] forSome { type F[_] }
implicitly[Databases[Any] <:< (Databases[F] forSome { type F[_] })]
带类型投影 (#
)正确的是
trait StaticRoles { this: Databases[({ type F[_] })#F] => }
Databases[({ type F[_] })#F]
也是一个子类型Databases[F] forSome { type F[_] }
(无法与Databases[Any]
对于不变式Databases
).
这三种类型中Databases[F] forSome { type F[_] }
, Databases[Any]
, and Databases[({ type F[_] })#F]
只有第一个适用于
trait IO[_]
class Abc extends Databases[IO] with StaticRoles // compiles
//class Abc1 extends StaticRoles // doesn't compile