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