1

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

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,换句话说,它认为它好像我没有Intval result: Int. 它是一个错误吗?

4

1 回答 1

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为 be 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)

错误是 scala 试图找到适用于这种情况的diverging implicit expansion隐式并陷入循环。这是一条红鲱鱼。

于 2014-12-17T00:26:11.550 回答