这个问题出现在我正在编写的模块中,但我做了一个展示相同行为的最小案例。为什么不在这里输入推理?
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