Скала Дотти Юнион Тип?

Используя плагин 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)

Почему это не работает? Я неправильно использую типы соединений? Это просто еще не работает?

1 ответ

Решение

Я не думаю, что это должно сработать. Это работает, если 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.

Конечно, подтверждающая документация практически не существует, и на данный момент нет полной спецификации. Я думаю, что, возможно, этот слайд является источником путаницы, поскольку это не компилируемый код.

Другие вопросы по тегам