我想定义一个Renamable
特征,支持一些需要可变名称字段的类。
这是我的第一次拍摄:
trait Renamable {
self =>
var name:String = _
def withName(name:String) = {
self.name = name
self
}
}
class Person extends Renamable {
def sayHello = println(s"Hello, i am $name")
}
我的问题是withName()
返回类型被推断为Renamable
,不允许我像这样链接方法调用:
new Person().withName("Julio").sayHello
//Error: value sayHello is not a member of Renamable
我已经读过我可以使用自我类型注释并将其用作返回类型,但我事先并不知道将使用哪种类型。我希望返回与使用特性的类相同,无关紧要。
我可以拥有“无限的自我类型”吗?
答案 0 :(得分:8)
您可以使用this.type
(可能self.type
也可以使用)。此类型的唯一有效值是this
,因此允许呼叫站点知道返回的值是呼叫的接收者:
trait Renamable {
var name:String = _
def withName(name:String): this.type = {
this.name = name
this
}
}