隐式参数中断类型推断或推理不足以解决它们?

时间:2014-12-14 09:39:27

标签: scala type-inference typeclass implicits

在我添加隐式排序证据之前,类型推断在此示例中正常工作。似乎满足了类型推断规则(从左到右和跨参数列表),但是有一些关于隐含它的东西会破坏它。

case class Insert[I, O : Ordering](arg: I)
def execute[I,O](req: Insert[I,O]): O = null.asInstanceOf[O]
val result: Int = execute(Insert("test"))

Error:(5, 39) diverging implicit expansion for type Ordering[O]
starting with method Tuple9 in object Ordering
lazy val result: Int = execute(Insert("test"));}
                                     ^

这编译并正常工作:

case class Insert[I, O](arg: I)
def execute[I,O](req: Insert[I,O]): O = null.asInstanceOf[O]
val result: Int = execute(Insert("test"))

因此,任何类型推断都不足以进行隐式解析或隐式解析中断类型推断。

我想推断O类型,但是当隐式解决方案发生时,它会将其视为Nothing,换句话说,它看起来好像我没有在{{1}中指定Int }}。这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

此处的问题是scala无法推断O类型,因为Insert

中没有该类型
// I is in the parameter list but there is no O to be found
case class Insert[I, O](arg: I)(implicit evidence: Ordering[O]) 

这使得编译器别无选择,只能将O推断为Nothing。创建Insert的实例将无法编译。

scala> val i = Insert(3)
<console>:9: error: diverging implicit expansion for type Ordering[O]
starting with method Tuple9 in object Ordering
   val i = Insert(3)

diverging implicit expansion错误是scala试图找到一个适用于这种情况并在循环中被捕获的隐式。这是一个红鲱鱼。