包对象类型成员和继承不能一起工作

时间:2017-01-14 23:07:35

标签: scala types

以下代码在Scala 2.11中完美编译:

trait A {
  type B
  def f(x: B): Unit
}

/*package*/ object C extends A {
  trait Z
  type B = Z
  def f(x: Z): Unit = {}
}

object D {
  val s: C.Z = ???
  C.f(s)
}

但是当取消注释package之前的object C时,会产生以下错误消息:

error: type mismatch;
 found   : s.type (with underlying type C.Z)
 required: A.this.B
    C.f(s)
        ^

所以不知何故,Scala似乎无法弄清楚,C.B实际上是C.Z的类型别名。

更奇怪的是,当您首次使用scalac编译文件时,代码会编译,首先没有包对象,然后使用包对象而不删除类文件;所以似乎还有增量编译的错误。

这是否有意义,或者这只是scala编译器中的一个错误?

更一般地说,我知道包对象和对象之间的主要区别在于对于包对象,同样的名称也允许作为包名(并且该对象在编译的类文件中映射到略有不同的名称)。还有什么其他差异?这显然似乎是一个,隐式分辨率优先级似乎也存在差异。

1 个答案:

答案 0 :(得分:2)

在2.12中编译。包对象中有别名的修复,但我没有链接,可能是相关的。

$ scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.

scala> :pa -raw
// Entering paste mode (ctrl-D to finish)

trait A {
  type B
  def f(x: B): Unit
}
package object C extends A {
  trait Z
  type B = Z
  def f(x: Z): Unit = {}
}

object D {
  val s: C.Z = ???
  C.f(s)
}

// Exiting paste mode, now interpreting.


scala> :quit

验证

$ scala211
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.

scala> :pa -raw
// Entering paste mode (ctrl-D to finish)

trait A {
  type B
  def f(x: B): Unit
}
package object C extends A {
  trait Z
  type B = Z
  def f(x: Z): Unit = {}
}

object D {
  val s: C.Z = ???
  C.f(s)
}

// Exiting paste mode, now interpreting.

<pastie>:13: error: type mismatch;
 found   : D.s.type (with underlying type C.Z)
 required: A.this.B
  C.f(s)
      ^
There were compilation errors!

scala>