Scala 包对象类型成员和继承don';我们不能一起工作

Scala 包对象类型成员和继承don';我们不能一起工作,scala,types,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) } 但是当对象C之前的包未注释时,会产生以下错误消息: error: type mismatch; found : s

以下代码在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)
}
但是当
对象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编译文件时,代码确实会编译,首先不使用package对象,然后使用package对象而不删除类文件;因此,增量编译似乎也存在一个bug

这有什么意义吗?或者这只是scala编译器中的一个bug


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

在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> 
$scala211
欢迎使用Scala 2.11.8(Java热点(TM)64位服务器虚拟机,Java 1.8.0_111)。
键入要计算的表达式。或者尝试:帮助。
scala>:pa-原始
//进入粘贴模式(按ctrl-D键完成)
特征A{
B型
def f(x:B):单位
}
包对象C扩展了{
性状Z
B型=Z型
def(x:Z):单位={}
}
对象D{
val s:C.Z=???
到岸价(s)
}
//正在退出粘贴模式,现在正在解释。
:13:错误:类型不匹配;
找到:D.s.type(具有基础类型C.Z)
要求:A.this.B
到岸价(s)
^
有编译错误!
斯卡拉>