Scala 将trait混入包对象两次

Scala 将trait混入包对象两次,scala,Scala,虽然这项工作如期进行: trait A trait B extends A object C extends A with B 以下结果产生了涉及特征B的非法循环引用: package cyclictest { trait A trait B extends A } package object cyclictest extends A with B 那里发生了什么?错误是正确的。编译器将名称A和B解析为完全限定的名称,因此typechecker看到的是: package objec

虽然这项工作如期进行:

trait A
trait B extends A
object C extends A with B
以下结果产生了涉及特征B的非法循环引用:

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

那里发生了什么?

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

package object cyclictest extends cyclictest.A with cyclictest.B
为了检查包对象定义是否正确,编译器需要知道
A
B
的所有成员,但为了知道这一点,它需要知道
cyclictest
的成员(因为
A
B
cyclictest
的成员)。但是,这是在定义cyclictest时发生的,因此您有一个无法解析的周期


第一个案例通过,因为包
cyclictest
没有继承任何内容,它是默认的基于目录的包。

尝试先从B继承。可能是编译器没有将对象的基类线性化。@Dirk,是的,一开始就很容易想到它。尽管如此,我还是想知道这是故意的还是某种错误?!我认为您对包对象的定义不能扩展包本身中定义的特性。scala规范说:“包对象不应定义与包p中定义的顶级对象或类同名的成员。如果存在名称冲突,则程序的行为目前尚未定义。”我认为您所做的就是重新定义特征a和B