给定Outer
类及其Inner
类的抽象定义,我想实例化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()
}
Scala编译器过早地终止了编译,并显示以下错误消息:“错误:无法实例化Inner1类,因为它不符合其自身类型Outer1.this.Inner_Tp的Outer1.this.Inner1。” 为什么?
毕竟,
Inner1
类在抽象上下文中定义为其Outer1
特性。我想将type Inner_Tp
的定义推迟到该特征混入某些具体类中之前。 最佳答案
对于Inner1
,自类型表示它将始终与抽象类型Inner_Tp
一起实例化。这是在实例化点上无法实现的 promise :类型仅为Inner1
而不是Inner1 with Inner_Tp
。
如果需要延迟Inner_Tp
的定义,那么还需要延迟创建将其作为自类型的任何实例。这是绝对必要的,因为您无法生成尚不知道的类型的值。因此最好将方法抽象化。您也可以优化抽象类型:
trait Outer1 extends Outer {
type Inner_Tp <: Inner1
protected class Inner1 extends Inner
def Inner1(): Inner_Tp
}
我不确定您要追求的是什么,但是您可能根本不需要自定义类型(为了简洁起见,我已经将它们省略了)。