【问题标题】:Scala Dotty Union Type?Scala Dotty Union 类型?
【发布时间】:2017-03-08 14:51:53
【问题描述】:

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

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

【问题讨论】:

    标签: scala dotty


    【解决方案1】:

    我不认为这应该真正起作用。如果AB 扩展了一个断言它们每个都有一个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
    

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

    当然,支持文档几乎不存在,目前还没有完整的规范。我认为this slide 可能会造成混淆,因为它不是可编译的代码。

    【讨论】:

    • DarkDimius 幻灯片是我困惑的根源。谢谢。
    • 如果A和B必须有共同的接口,那么我们使用的是继承。在这种情况下,联合类型比这更好或有什么帮助?
    • @thlim 因为联合类型被用来证明oAB。联合类型本身并没有说明 AB 是如何相关的,因为它们不一定是相关的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2021-02-05
    • 2020-03-24
    • 2018-12-19
    • 1970-01-01
    • 2018-10-07
    相关资源
    最近更新 更多