7

有没有办法让一个方法总是返回调用它的同一个类的类型?

让我解释:

class Shape {
  var mName: String = null
  def named(name: String): Shape = {
    mName = name
    this
  }
}

class Rectangle extends Shape {
  override def named(name: String): Rectangle = {
    super.named(name)
    this
  }
}

这可行,但是有没有办法做到这一点而不必覆盖named我所有子类中的函数?我正在寻找这样的东西(不起作用):

class Shape {
  var mName: String = null
  def named(name: String): classOf[this] = { // Does not work but would be great
    mName = name
    this
  }
}

class Rectangle extends Shape {
}

任何的想法 ?还是不可能?

4

1 回答 1

18

您需要使用this.type而不是classOf[this].

class Shape {
  var mName: String = null
  def named(name: String): this.type = {
    mName = name
    this
  }
}

class Rectangle extends Shape {
}

现在证明它有效(在 Scala 2.8 中)

scala> new Rectangle().named("foo")
res0: Rectangle = Rectangle@33f979cb

scala> res0.mName
res1: String = foo

this.type是编译类型名称,而classOf是在运行时调用以获取java.lang.Class对象的运算符。您永远不能使用classOf[this],因为参数必须是类型名称。尝试获取java.lang.Class对象时的两个选择是调用classOf[TypeName]this.getClass()

于 2012-10-24T12:08:09.657 回答