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

gd1*_*gd1 9 java scala inner-classes

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

interface T {
    interface Q {
    }
}

class C implements T.Q {
}
Run Code Online (Sandbox Code Playgroud)

而Scala中的此代码不会:

trait T {
    trait Q {
    }
}

class C extends T.Q {
}
Run Code Online (Sandbox Code Playgroud)

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

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

pag*_*_5b 10

内部类型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 c.Q {}
res4: c.Q = $anon$1@36bbb2f5
Run Code Online (Sandbox Code Playgroud)

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

scala> object T {
     |   trait Q {
     |     def implementMe: Unit
     |   }
     | }
defined module T

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

scala> inT.implementMe
implemented!
Run Code Online (Sandbox Code Playgroud)

为什么路径依赖类型?

至于设计原因,请看这里