将特征混合到一个包对象中两次

Pet*_*itz 6 scala

虽然这按预期工作:

trait A
trait B extends A
object C extends A with B
Run Code Online (Sandbox Code Playgroud)

以下产量illegal cyclic reference involving trait B:

package cyclictest {
  trait A
  trait B extends A
}
package object cyclictest extends A with B
Run Code Online (Sandbox Code Playgroud)

那里发生了什么?

Iul*_*gos 2

错误是正确的。编译器将名称解析AB完全限定名称,因此类型检查器看到的是:

package object cyclictest extends cyclictest.A with cyclictest.B
Run Code Online (Sandbox Code Playgroud)

为了检查包对象定义是否正确,编译器需要知道A和的所有成员B,但为了知道这一点,它需要知道 的成员cyclictest(因为AB是 的成员cyclictest)。然而,这种情况发生在定义 cyclotest 时,因此你有一个无法解决的循环。

第一种情况通过了,因为该包cyclictest没有继承任何东西,它是默认的基于目录的包。