Scala中的类型

Mik*_*yer 7 inheritance types scala

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

让我解释:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但有没有办法在不必覆盖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 {
}
Run Code Online (Sandbox Code Playgroud)

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

Ken*_*oom 18

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

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

class Rectangle extends Shape {
}
Run Code Online (Sandbox Code Playgroud)

现在来证明它的工作原理(在Scala 2.8中)

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

scala> res0.mName
res1: String = foo
Run Code Online (Sandbox Code Playgroud)

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