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

Dotty/Scala 3中的结构类型编译失败?,scala,structural-typing,dotty,scala-3,Scala,Structural Typing,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中使用结构类型?谢谢 据我所见: 推理已

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

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)
  }
}
我猜您必须这样做的原因是因为很多时候,当一个人不想进行优化时,他已经进行了优化(例如,测试所有测试夹具
newfixture{…}
都是不必要的优化类型)。另一个是,在访问优化(Scala 2中)时,优化使用反射,这会导致性能损失——因此我们应该有意识地而不是偶然地这样做

在Scala 3中,结构类型是使用实现的,这需要在
selective
trait中进行混合。因此,您必须导入
scala.reflect.Selectable.reflectiveSelectable
隐式转换,以允许它像scala 2中一样工作。如果您想让事情像以前一样工作,可以添加
import reflect.selective.{given}
,正如@Dmytro Mitin所建议的那样(并将反射添加回来)


您可以尝试在全局范围内执行此操作,例如,通过在包中执行此操作,但您将自行承担风险。

导入也可以写成
Import reflect.selective.{given}
。实际上,我认为旧式结构类型对于使用Scala更像一种“动态”语言非常有用,在保持静态类型检查的同时,不需要显式声明类型。新样式的结构类型在编写类型时非常繁琐。我真的希望Scala 3保留旧式的结构类型。可能吗?