Scala模式匹配推断`Any`而不是存在类型,打破类型安全?

 淅沥的雨的海角_960 发布于 2023-02-13 10:06

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

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")
}

斯卡拉决定a: Anyf: Any => Any,但是这是不恰当的; 他们真的应该有类型的a: SomeTypeAf: SomeTypeA => SomeTypeB,其中SomeTypeASomeTypeB未知类型.

另一种说法是我认为假设的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上.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有