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を取得する演算子です。パラメータは型名である必要があるため、everjava.lang.Classは使用できません。classOf[this]オブジェクトを取得しようとするときの 2 つのオプションは、またはjava.lang.Classを呼び出すことです。classOf[TypeName]this.getClass()

于 2012-10-24T12:08:09.657 に答える