1

使用 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)

为什么这不起作用?我使用联合类型错误吗?这还不行吗?

4

1 回答 1

1

我不认为这应该真正起作用。如果并扩展一个断言它们每个都有一个通用接口,它确实有效:ABx: 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

没有它,编译器将需要反思AB确定它们是否具有相同的x定义,这似乎不符合简化 Scala 类型系统的目标。

当然,支持文档几乎不存在,此时没有完整的规范。我认为这张幻灯片可能会造成混淆,因为它不是可编译的代码。

于 2017-03-08T06:51:53.103 回答