Inferring тип общего неявного параметра из возвращаемого типа
Скажем, у меня есть простой класс, как это
abstract class Foo {
implicit val impInt: Int = 42
def f[A]()(implicit a: A): A
val f2: Int = f()
}
При объявлении valf2
Компилятор может сделать вывод, что тип неявного параметра функцииf
являетсяInt
потому что этот тип совпадает с типом результата, а тип результата должен соответствовать типу значенияf2
, которыйInt
.
Тем не менее, бросаяOrdering[A]
в смесь:
def f[A]()(implicit a: A, m: Ordering[A]): A
val f2: Int = f()
приводит к этой ошибке компиляции:
Неоднозначные неявные значения: оба значения StringCanBuildFrom в объекте Predef типа => scala.collection.generic.CanBuildFrom [String, Char, String] и метод $ соответствуют объекту Predef типа [A] => <: <[A, A] соответствует ожидаемому типу A
Если я добавлю информацию о типе при вызовеf()
, он компилирует:
val f2: Int = f[Int]()
Сначала я столкнулся со случаем с неявным упорядочением и подумал, что это связано с выводом Scala слева направо; Я думал, что это не в состоянии соответствовать типу возврата сначала изатем вывести (неявный) тип параметраf
, Но потом я попробовал дело без неявного упорядочения и увидел, что это работает - это вывести, чтоf
должен быть параметризованInt
потому что тип возвращаемого значения должен бытьInt
(так какf2
являетсяInt
).
Обратите внимание, что если мы удалимimplicit a: A
и оставить только неявный параметр Ordering, ошибка остается, но становится
Расхождение неявного расширения для типа Ordering [A], начиная с метода Tuple9 в объекте Ordering.
Снова, добавив параметр типа, чтобы он сталval f2: Int = f[Int]()
помогает.
В чем дело? Почему компилятор может вывести этот параметрA
должен бытьInt
но не тот параметрOrdering[A]
должен бытьOrdering[Int]
?