假設我有兩個類,Input
和Output
,它們被設計爲相互連接。 Output
產生某種類型的值,並且Input
消耗它們。爲什麼在這個例子中Scala不能推斷出類型參數?
class Input[T] {
var output: Option[Output[_ <: T]] = None
}
class Output[T] {
var input: Option[Input[_ >: T]] = None
}
如果Input
和Output
對不上相同類型的值只要Input
類型參數是Output
類型參數的超類型操作沒事。請注意,兩個類中的類型參數都是不變的;在真正的版本中,它被用在共同和逆變的位置。
我有一個connect
方法別處其中設置了一個Input
/Output
對之間的鏈路:
def connect[T](output: Output[T], input: Input[_ >: T]) = {
output.input = Some(input)
input.output = Some(output)
}
如果我如下調用此方法,得到了一個錯誤類型:
val out = new Output[String]
val in = new Input[AnyRef]
connect(out, in)
錯誤是:
test.scala:17: error: type mismatch;
found : Output[String]
required: Output[AnyRef]
connect(out, in)
^
我可以通過寫出類型參數來解決這個問題(在這種情況下,我會寫connect[String]
,但我認爲編譯器應該能夠爲我弄明白這一點。如何更改connect
方法以便自動推斷類型參數?
編輯:現在,我做了connect
的Output
一個方法,因此自動獲得的類型參數。這也有額外的好處,我可以使用中綴記號out connect in
,但設計感覺有點尷尬。
我仍然對爲什麼編譯器會出現這種行爲感興趣。我覺得它應該能夠推斷出類型參數。這是否按照指定的方式工作?
您的意思是「不要*在相同類型的值上運行*」 – 2009-07-26 19:17:00
您是否試過向斯卡拉郵件列表提問? – GClaramunt 2009-07-31 18:30:06