Неявные параметры нарушают вывод типа или вывода не хватает для их разрешения?
Вывод типа работает нормально в этом примере, пока я не добавлю неявное доказательство упорядочения. Правила вывода типов (слева направо и через списки параметров), похоже, удовлетворены, но есть что-то в отношении неявного, которое нарушает его.
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
Тип выводится, но когда происходит неявное разрешение, он видит его как Ничто, другими словами, он видит его так, как будто я не указал Int
в val result: Int
, Это ошибка?
1 ответ
Проблема здесь в том, что скала не может вывести 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 найти неявное, подходящее для этого случая, и попасть в цикл. Это красная сельдь.