Scala 模式匹配推断“Any”而不是存在类型,会破坏类型安全吗?

2024-04-13

我遇到了一个令人费解的案例类类型推理问题。这是一个最小的例子:

trait T[X]
case class Thing[A, B, X](a: A, f: A => B) extends T[X]

def hmm[X](t: T[X]) = t match {
  case Thing(a, f) => f("this really shouldn't typecheck")
}

Scala 决定a: Any and f: Any => Any,但这是不合适的;他们确实应该有类型a: SomeTypeA and f: SomeTypeA => SomeTypeB, where SomeTypeA and SomeTypeB都是未知类型。

另一种说法是我认为假设Thing.unapply方法应该类似于

def unapply[X](t: T[X]): Option[(A, A => B)] forSome { type A; type B } = {
  t match {
    case thing: Thing[_, _, X] => Some((thing.a, thing.f))
  }
}

该版本正确地给出了类型错误f("this really shouldn't typecheck").

这看起来像是编译器中的错误,还是我遗漏了什么?

编辑:这是在 Scala 2.10.3 上。


Mark Harrah 在 Freenode 的 #scala 频道中指出了这一点:是的,这是一个错误。

https://issues.scala-lang.org/browse/SI-6680 https://issues.scala-lang.org/browse/SI-6680

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 模式匹配推断“Any”而不是存在类型,会破坏类型安全吗? 的相关文章

随机推荐