微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以用通配符表示的存在类型会导致不同的行为

如何解决可以用通配符表示的存在类型会导致不同的行为

考虑以下示例:

sealed trait Test

case object A extends Test

sealed trait Type {
  type Tst <: Test
}

type Aux[T <: Test] = Type { type Tst = T }

case object Type1 extends Type {
  type Tst = A.type
}

case class Model[T <: Type](t: T)

val a: Model[Aux[A.type]] = null

val b: Model[_ <: Aux[_ <: Test]] = a //Compiles fine

val c: Model[T forSome { type T <: Aux[_ <: Test]}] = a  //Compile error type mismatch

Scastie Demo

我认为 val bval c 的类型是相同的。为什么后面的案例不编译?

解决方法

这里的技巧是提取参数列表之外的存在类型定义,如下所示

val c: Model[T] forSome { type T <: Aux[_ <: Test]} = a

val d: Model[T] forSome { type T <: Aux[T] forSome { type T <: Test}} = a

尽管这种行为非常不明显,但我通过一些奇怪的实验找到了解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。