在我添加隐式排序证据之前,类型推断在此示例中正常工作。似乎满足了类型推断规则(从左到右和跨参数列表),但是有一些关于隐含它的东西会破坏它。
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
}}。这是一个错误吗?
答案 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试图找到一个适用于这种情况并在循环中被捕获的隐式。这是一个红鲱鱼。