在Scala中实现内部特征,就像在Java中使用内部接口一样

Java中的这段代码编译时没有错误:

interface T { interface Q { } } class C implements TQ { } 

而Scala中的此代码不会:

 trait T { trait Q { } } class C extends TQ { } 

Scala中Java代码列表的正确翻译(如果存在)是什么?

关于语言设计的理论解释是受欢迎的。

内部类型Q仅针对T特征的特定实例实现而定义。 由于scala具有路径依赖类型,因此T每个实例都将拥有自己的子特征Q

 scala> trait T { | trait Q | } defined trait T scala> class C extends T { | def getQ: this.Q = new this.Q {} | } defined class C scala> val inC = (new C).getQ inC: C#Q = C$$anon$1@3f53073a scala> val c = new C c: C = C@1a7e4ff0 scala> new cQ {} res4: cQ = $anon$1@36bbb2f5 

如果您需要为客户端实现通用行为的接口,而不依赖于特定的C实例,则应在Object定义它

 scala> object T { | trait Q { | def implementMe: Unit | } | } defined module T scala> val inT = new TQ { | def implementMe = println("implemented!") | } inT: TQ = $anon$1@20f2a08b scala> inT.implementMe implemented! 

为什么路径依赖类型?

至于设计原因,请看这里

你不能这样做。 当嵌套类型时,您正在创建所谓的路径依赖类型 ,这意味着内部实体的每个实例的类型都与构造它的特定实例相关联。

换句话说,你的接口Q没有独立存在,只允许你从T的实例中引用它。