Java中的这段代码编译没有错误:
interface T {
interface Q {
}
}
class C implements T.Q {
}
而Scala中的这段代码没有:
trait T {
trait Q {
}
}
class C extends T.Q {
}
Java 代码清单到 Scala 的正确翻译(如果存在)是什么?
欢迎提供有关语言设计的理论解释。
Java中的这段代码编译没有错误:
interface T {
interface Q {
}
}
class C implements T.Q {
}
而Scala中的这段代码没有:
trait T {
trait Q {
}
}
class C extends T.Q {
}
Java 代码清单到 Scala 的正确翻译(如果存在)是什么?
欢迎提供有关语言设计的理论解释。
内部类型Q
仅为T
trait 的特定实例实现而定义。由于 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!
为什么是路径依赖类型?
至于设计原因,看这里
你不能这样做。嵌套类型时,您将创建所谓的路径依赖类型,这意味着内部实体的每个实例的类型都与构造它的特定实例相关联。
换句话说,你的接口 Q 没有独立的存在,可以让你在 T 的实例之外引用它。