如何修复上限类型的PolymorphicExpression错误

时间:2017-09-15 21:35:36

标签: scala

我遇到了无法识别类型的隐式转换问题。我伪造了最小的(不是)工作示例以使事情变得清晰。但我仍然没有理解为什么我的代码被拒绝,我应该如何重写它。

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]

passpassNow传递编译器。您可以从其名称中猜出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

所提供的错误信息远不如我上面所描述的那样具有描述性。这就是为什么我避免在原始示例中使用含义。

1 个答案:

答案 0 :(得分:0)

  

我遇到了无法识别类型的隐式转换问题。

由于您的最小示例不包含任何隐式转换,因此很难说。

当你没有使用类型参数注释knot时,编译器显然无法正确推断它们(有时编译器会因推理更高级的类型而出现问题)

val fail : Knot[Any, AnyK] = knot

但是当你明确注释它们时,一切正常

val passNow : Knot[Any, AnyK] = knot[Any, AnyK]

所以只需在必要时注释它们。