这个问题出现在我正在编写的模块中,但我制作了一个表现相同行为的最小案例。
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_|
来让这更容易。
实际错误:
推断的类型参数 [Nothing,Minimal[Int]] 不符合方法应用的类型参数边界 [T,X <: Sugar.S[T]]