Scala中的类型

时间:2012-10-24 11:55:39

标签: scala inheritance types

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

让我解释一下:

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 {
}

有什么想法吗?或者是不可能的?

1 个答案:

答案 0 :(得分: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()