這個問題出現在我正在編寫的模塊中,但我做了一個展示相同行爲的最小案例。爲什麼不在這裏輸入推理?
class Minimal[T](x : T) {
def doSomething = x
}
object Sugar {
type S[T] = { def doSomething : T }
def apply[T, X <: S[T]] (x: X) = x.doSomething
}
object Error {
val a = new Minimal(4)
Sugar(a) // error: inferred [Nothing, Minimal[Int]] does not fit the bounds of apply
Sugar[Int, Minimal[Int]](a) // works as expected
}
的問題是,編譯器設法計算出用於Minimal
(Int
)內的參數,但然後設置的T
其它發生於Nothing
,這顯然不匹配apply
。這些肯定是相同的T
,因爲刪除第一個參數使第二個抱怨T未定義。
是否存在一些含糊不清的含義,即編譯器無法推斷出第一個參數,或者這是一個錯誤?我能優雅地解決這個問題嗎?
更多信息:此代碼是一個嘗試語法糖的簡單示例。原始代碼試圖使|(a)|
表示模數a
,其中a是一個向量。很明顯,|(a)|
比編寫|[Float,Vector3[Float]](a)|
要好,但不幸的是我不能使用unary_|
來使這更容易。
實際的錯誤:
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
是的,這個解決方案在我的情況下工作正常。它比約書亞的解決方案更清潔(對不起約書亞!)。你能解釋爲什麼約書亞的解決方案有效嗎? – Dylan 2012-04-27 18:37:43
答案更新,以解釋Joshua解決方案的原因。 – 2012-04-27 20:05:49