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保留旧式的结构类型。可能吗?