Scala Dotty 联合类型?
Scala Dotty Union Type?
使用 sbt dotty 插件:
addSbtPlugin("com.felixmulder" % "sbt-dotty" % "0.1.9")
和运行 sbt console
,我尝试了新的联合类型特性:
Starting dotty interpreter...
Welcome to Scala.next (pre-alpha, git-hash: 606e36b) (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_112).
Type in expressions to have them evaluated.
Type :help for more information.
scala> case class A(val x: Int, y: Double)
defined class A
scala> case class B(val x: Int, y: String)
defined class B
scala> def getX(o: A | B): Int = o.x
-- [E008] Member Not Found Error: <console> ------------------------------------
8 |def getX(o: A | B): Int = o.x
| ^^^
| value `x` is not a member of (A | B)(o)
为什么这不起作用?我使用的联合类型错了吗?这还不行吗?
我认为这实际上不起作用。它 如果 A
和 B
扩展一个公共接口,断言它们每个都有一个 x: Int
:
trait C { def x: Int }
case class A(x: Int, y: Double) extends C
case class B(x: Int, y: String) extends C
def getX(o: A | B): Int = o.x
scala> getX(A(1, 2))
val res0: Int = 1
没有它,编译器需要反思性地查看 A
和 B
以确定它们是否具有相同的 x
定义,这似乎不符合简化 Scala 类型系统的目标。
当然,支持文档几乎不存在,目前还没有完整的规范。我想也许 this slide 是混淆的根源,因为它不是可编译的代码。
使用 sbt dotty 插件:
addSbtPlugin("com.felixmulder" % "sbt-dotty" % "0.1.9")
和运行 sbt console
,我尝试了新的联合类型特性:
Starting dotty interpreter...
Welcome to Scala.next (pre-alpha, git-hash: 606e36b) (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_112).
Type in expressions to have them evaluated.
Type :help for more information.
scala> case class A(val x: Int, y: Double)
defined class A
scala> case class B(val x: Int, y: String)
defined class B
scala> def getX(o: A | B): Int = o.x
-- [E008] Member Not Found Error: <console> ------------------------------------
8 |def getX(o: A | B): Int = o.x
| ^^^
| value `x` is not a member of (A | B)(o)
为什么这不起作用?我使用的联合类型错了吗?这还不行吗?
我认为这实际上不起作用。它 如果 A
和 B
扩展一个公共接口,断言它们每个都有一个 x: Int
:
trait C { def x: Int }
case class A(x: Int, y: Double) extends C
case class B(x: Int, y: String) extends C
def getX(o: A | B): Int = o.x
scala> getX(A(1, 2))
val res0: Int = 1
没有它,编译器需要反思性地查看 A
和 B
以确定它们是否具有相同的 x
定义,这似乎不符合简化 Scala 类型系统的目标。
当然,支持文档几乎不存在,目前还没有完整的规范。我想也许 this slide 是混淆的根源,因为它不是可编译的代码。