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

时间:2011-10-11 15:05:26

标签: scala

虽然这可以按预期工作:

trait A
trait B extends A
object C extends A with B

以下产生illegal cyclic reference involving trait B

package cyclictest {
  trait A
  trait B extends A
}
package object cyclictest extends A with B

那里发生了什么事?

1 个答案:

答案 0 :(得分:2)

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

package object cyclictest extends cyclictest.A with cyclictest.B

为了检查包对象定义是否正确,编译器需要知道AB的所有成员,但为了知道这一点,它需要知道成员cyclictest(因为ABcyclictest)的成员。但是,在定义cyclictest 时会发生,因此您有一个无法解析的循环。

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