Dotty/Scala 3 中的结构类型编译失败?



我测试了以下结构类型的代码:

trait Data
object Main
{
def main(args: Array[String]): Unit =
{
val data = new Data {
val value: Int = 1
}
println(data.value)
}
}

它在 Scala 2.13.2 中成功编译,但在 Dotty/Scala3 中失败。如何在 Dotty/Scala3 中使用结构类型?谢谢!

据我所知:

  • 推理发生了变化,因此您必须显式优化类型:
    val data: Data { val value: Int } = new Data {
    val value: Int = 1
    }
    
    运行dotr时可以清楚地看到它并检查推断的类型是什么
  • 要利用优化,您必须让编译器知道您不介意反射
    import reflect.Selectable.reflectiveSelectable
    

把它放在一起:

import reflect.Selectable.reflectiveSelectable
trait Data
object Main
{
def main(args: Array[String]): Unit =
{
val data: Data { val value: Int } = new Data {
val value: Int = 1
}
println(data.value)
}
}

我想你必须这样做的原因是,很多时候,当一个人不想进行改进时,他就拥有了它(例如,测试所有测试夹具new Fixture { ... }不必要地进行了改进类型(。另一个是细化在访问细化时使用反射(在 Scala 2 中(,这会导致性能损失 - 所以我们应该有意识地而不是偶然地这样做。

在 Scala 3 中,结构类型是使用动力学实现的,这需要混合Selectable特征。因此,您必须导入隐式转换scala.reflect.Selectable.reflectiveSelectable以允许它像在 Scala 2 中一样工作。如果你想让事情像以前一样工作,你可以按照@Dmytro Mitin的建议添加import reflect.Selectable.{ given _ }(并重新添加反射(。

您可以尝试在全球范围内执行此操作,例如将其导出到您的包中,但您将自行承担风险。

最新更新