1
比方说,我想有类似以下内容:子类和返回类型
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的类型系统的一些重要事实,请您在此澄清我在做什么错误,并告诉我如何仅使用一个类型参数来执行此操作?
谢谢!由于你的“FooBar”解释,我现在明白我做错了什么。我的主要目标是保持签名清晰,所以这正是所寻求的。 – fotNelton 2011-03-22 13:01:00