有没有像“无界自我类型”这样的东西?

时间:2014-12-14 15:16:54

标签: scala

我想定义一个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

我已经读过我可以使用自我类型注释并将其用作返回类型,但我事先并不知道将使用哪种类型。我希望返回与使用特性的类相同,无关紧要。

我可以拥有“无限的自我类型”吗?

1 个答案:

答案 0 :(得分:8)

您可以使用this.type(可能self.type也可以使用)。此类型的唯一有效值是this,因此允许呼叫站点知道返回的值是呼叫的接收者:

trait Renamable {
    var name:String = _

    def withName(name:String): this.type = {
        this.name = name
        this
    }
}