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