Tim*_*ske 3 scala class traits abstract self-type
鉴于Outer类及其Inner类的抽象定义,我想实例化trait中Inner1定义的具体类Outer1.
abstract class Outer {
type Inner_Tp <: Inner;
abstract class Inner {
self: Inner_Tp =>
}
}
trait Outer1 {
self: Outer =>
protected class Inner1 extends Inner {
self: Inner_Tp =>
}
def Inner1() = new Inner1()
}
Run Code Online (Sandbox Code Playgroud)
Scala编译器过早地终止编译,给出了以下错误消息:"错误:类Inner1无法实例化,因为它不符合其自身类型Outer1.this.Inner1 with Outer1.this.Inner_Tp".为什么?
Inner1在一个抽象的上下文中定义所有类之后,它就是它的Outer1特征.我想推迟定义,type Inner_Tp直到特质混入一些具体的类.
因为Inner1,自我类型表示它将始终与抽象类型一起实例化Inner_Tp.这是在实例化点没有实现的承诺:类型只是Inner1代替Inner1 with Inner_Tp.
如果需要延迟定义Inner_Tp,还需要延迟创建任何将其作为自我类型的实例.这是绝对必要的,因为您无法生成您还不知道的类型的值.所以最好把方法抽象化.您也可以优化抽象类型:
trait Outer1 extends Outer {
type Inner_Tp <: Inner1
protected class Inner1 extends Inner
def Inner1(): Inner_Tp
}
Run Code Online (Sandbox Code Playgroud)
我不确定你在追求什么,但你可能根本不需要自我类型(为了简洁,我把它们留下了).