我测试了以下结构类型的代码:
trait Data
object Main
{
def main(args: Array[String]): Unit =
{
val data = new Data {
val value: Int = 1
}
println(data.value)
}
}它在Scala2.13.2中成功编译,但在Dotty/ Scala 3中失败。如何在Dotty/Scala3 3中使用结构类型?谢谢!
发布于 2020-06-03 09:44:50
据我所见:
dotr并检查推断类型时,您可以清楚地看到它。把它放在一起:
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的建议添加import reflect.Selectable.{ given _ } (并添加反射回)。
您可以尝试在全球范围内这样做,例如,通过在您的包中出口它,但它您将承担您自己的风险。
https://stackoverflow.com/questions/62167454
复制相似问题