[编辑更新] 这是我的问题的正确陈述。
我希望在trait
内调用构造函数。 但似乎我必须使用apply
功能。它是否存在像新这个((这样的用法?
就像下面的代码一样。它引发类型不匹配。我希望添加构造函数的约束,否则我必须使用apply
函数。
trait B { this:C =>
def values:Seq[Int]
def apply(ints:Seq[Int]):this.type
def hello:this.type = apply( values map (_ + 1) )
}
trait C
class A(val v:Seq[Int]) extends C with B{
override def values: Seq[Int] = v
override def apply(ints: Seq[Int]): A.this.type = new A(ints)
}
>this.type
是此特定实例的类型。所以你可以写
override def hello = this
但你不能写
override def hello = new A()
由于A
是this.type
的超类型.
可能你想要
trait B { this: C =>
type This <: B /*or B with C*/
def hello: This
}
trait C
class A extends C with B {
type This = A
override def hello = new A()
}
甚至
trait B { self: C =>
type This >: self.type <: B with C { type This = self.This }
def hello: This
}
返回 Scala 中的"当前"类型https://tpolecat.github.io/2015/04/29/f-bounds.html