一个班级可以延伸吗?

Joh*_*ass 3 scala

我正在阅读Spark的源代码.我看到似乎一个类扩展了自己.

我的问题:它是否会延伸?如果是这样,它叫什么?我们为什么这样做?

class OneHotEncoderModel private[ml] (
    @Since("2.3.0") override val uid: String,
    @Since("2.3.0") val categorySizes: Array[Int])
  extends Model[OneHotEncoderModel] with OneHotEncoderBase with MLWritable
Run Code Online (Sandbox Code Playgroud)

Juh*_*uh_ 5

它没有扩展自己.实际上,"扩展自身"没有任何意义,或者可以说所有类都扩展了它们自己.

OneHotEncoderModel(...) extends Model[OneHotEncoderModel] with ...
Run Code Online (Sandbox Code Playgroud)

意味着OneHotEncoderModel延伸Model.并且Model是用类型参数化的OneHotEncoderModel.此构造允许Model将实际的实现类作为类型参数并使用它.

例如,这可以在抽象API中使用:

trait Model[A]{
  def join(other: A): A
}
Run Code Online (Sandbox Code Playgroud)

在这里,要成为一个Model子类,OneHotEncoderModel必须要实现def join(other: OneHotEncoderModel): OneHotEncoderModel