我遇到了无法识别类型的隐式转换问题。我伪造了最小的(不是)工作示例以使事情变得清晰。但我仍然没有理解为什么我的代码被拒绝,我应该如何重写它。
trait AnyK[X]
trait Simple[X, U[_]]
trait Knot[X, U[_ <: X]]
def simple[X, U[_]] = new Simple[X, U] {}
def knot[X, U[_ <: X]] = new Knot[X, U] {}
val pass : Simple[Any, AnyK] = simple
val fail : Knot[Any, AnyK] = knot
val passNow : Knot[Any, AnyK] = knot[Any, AnyK]
pass
和passNow
传递编译器。您可以从其名称中猜出fail
失败,并出现以下错误:
PolymorphicExpression.scala:11: error: polymorphic expression cannot be instantiated to expected type;
found : [X, U[_ <: X]]test.package.Knot[X,U]
required: test.package.Knot[Any,test.package.AnyK]
val fail : Knot[Any, AnyK] = knot
^
one error found
由于目前尚不清楚,我做了一个稍微复杂的例子来说明为什么暗示会让事情变得更难。
trait AnyK[X]
trait Simple[X, U[_]]
trait Knot[X, U[_ <: X]]
implicit def simple[X, U[_]] = new Simple[X, U] {}
implicit def knot[X, U[_ <: X]] = new Knot[X, U] {}
val pass = implicitly[Simple[Any, AnyK]]
val fail = implicitly[Knot[Any, AnyK]]
我收到以下错误消息:
PolymorphicExpression.scala:25: error: could not find implicit value for parameter e: test.package.Knot[Any,test.package.AnyK]
val fail = implicitly[Knot[Any, AnyK]]
^
one error found
所提供的错误信息远不如我上面所描述的那样具有描述性。这就是为什么我避免在原始示例中使用含义。
答案 0 :(得分:0)
我遇到了无法识别类型的隐式转换问题。
由于您的最小示例不包含任何隐式转换,因此很难说。
当你没有使用类型参数注释knot
时,编译器显然无法正确推断它们(有时编译器会因推理更高级的类型而出现问题)
val fail : Knot[Any, AnyK] = knot
但是当你明确注释它们时,一切正常
val passNow : Knot[Any, AnyK] = knot[Any, AnyK]
所以只需在必要时注释它们。