當我試圖編譯小例子:類型推斷沒有在斯卡拉
trait Foo[A,B] {
type F[_,_]
def foo(): F[A,B]
}
class Bar[A,B] extends Foo[A,B] {
type F[D,E] = Bar[D,E]
def foo() = this
}
object Helper {
def callFoo[A,B,FF <: Foo[A,B]](f: FF): FF#F[A,B] =
f.foo()
}
object Run extends App {
val x = new Bar[Int,Double]
val y = Helper.callFoo(x)
println(y.getClass)
}
我得到的錯誤:
[error] src/Issue.scala:20: inferred type arguments
[Nothing,Nothing,issue.Bar[Int,Double]] do not conform to method callFoo's type
parameter bounds [A,B,FF <: issue.Foo[A,B]]
[error] val y = Helper.callFoo(x)
顯然,類型推理機制並不能夠推斷出A和B超出酒吧[A,B]。然而,它的工作,如果我通過所有類型的手:
val y = Helper.callFoo[Int,Double,Bar[Int,Double]](x)
我有辦法避免顯式傳遞類型?
@Kipton_Barros:嗯,我選擇讓 - 菲利普答案只是因爲它意味着更少的重構與我目前的代碼庫。 – paradigmatic
@paradigmatic是的,Jean-Philippe的回答非常好。我發現有趣的是,儘管'FF'參數不必更高一些,所以它可以幫助推斷。我嘗試了讓 - 菲利普的技術來解決相關的問題,但是到目前爲止還無法實現它:http://stackoverflow.com/questions/6892781/why-doesnt-scala-fully-infer-type-parameters-when-型參數,是嵌套/ 6893057#6893057 –