10

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

interface T {
    interface Q {
    }
}

class C implements T.Q {
}

而Scala中的这段代码没有:

trait T {
    trait Q {
    }
}

class C extends T.Q {
}

Java 代码清单到 Scala 的正确翻译(如果存在)是什么?

欢迎提供有关语言设计的理论解释。

4

2 回答 2

11

内部类型Q仅为Ttrait 的特定实例实现而定义。由于 scala 具有依赖于路径的类型,因此每个实例T都有自己的 subtrait 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

如果您需要一个接口来实现客户端的通用行为,而不依赖于特定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!

为什么是路径依赖类型?

至于设计原因,看这里

于 2013-03-25T13:52:23.950 回答
3

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

换句话说,你的接口 Q 没有独立的存在,可以让你在 T 的实例之外引用它。

于 2013-03-25T13:40:10.617 回答