在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的实例中引用它。