如何让特征在scala中使用`this`构造函数?
How to let trait use `this` constructor in scala?
[编辑更新]这是对我的问题的正确陈述。
希望在trait
里面调用构造函数。
但似乎我必须使用 apply
功能。是否存在像 new this() 这样的用法?
喜欢下面的代码。它抛出类型不匹配。我希望添加构造函数的约束,或者我必须使用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 中的 "Current" 类型 https://tpolecat.github.io/2015/04/29/f-bounds.html
[编辑更新]这是对我的问题的正确陈述。
希望在trait
里面调用构造函数。
但似乎我必须使用 apply
功能。是否存在像 new this() 这样的用法?
喜欢下面的代码。它抛出类型不匹配。我希望添加构造函数的约束,或者我必须使用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 中的 "Current" 类型 https://tpolecat.github.io/2015/04/29/f-bounds.html