допустим, я хотел получить что-то вроде следующего:
abstract class PDF[T, S <: PDF[T, _]] {
def fit(obs: Seq[T], weights: Seq[Double]): S
}
class PDFGaussian(val mu: Double, val Sigma: Double) extends PDF[Double, PDFGaussian] {
def fit(obs: Seq[Double], weights: Seq[Double]): PDFGaussian =
new PDFGaussian(...) // bla bla bla
}
Итак, в общем, я хочу, чтобы функция fit
возвращала экземпляр типа его включающий класс, который, очевидно, должен быть подклассом PDF[T]
.Однако вместо того, чтобы использовать двойную параметризацию PDF[T, S <: PDF[T, _]]
, я бы предпочел использовать только один параметр типа, например:
abstract class PDF[T] {
def fit[S <: PDF[T]](obs: Seq[T], weights: Seq[Double]): S
}
class PDFGaussian(val mu: Double, val Sigma: Double) extends PDF[Double] {
def fit[S <: PDF[_]](obs: Seq[Double], weights: Seq[Double]): S =
new PDFGaussian(...) // bla bla bla
}
Однако, если я сделаю это, компилятор выкрикивает на меня запрос на возврат PDFGaussian
вместо S
.Поскольку я явно упускаю из виду некоторые важные факты о системе типов scala, не могли бы вы уточнить, что я делаю неправильно, и показать, как это сделать только с одним параметром типа?