Почему неявное преобразование от долгого до Ричлонга не применяется, где ожидается супертип Ричлонга?
-
01-10-2019 - |
Вопрос
Scala 2.8 Спец говорит, что в разделе 7.3 (выделение является моим):
Неявные параметры и методы также могут определить неявные преобразования, называемые видами. Взгляд от типа S для типа T определяется неявному значению, которое имеет тип функции s => t или (=> s) => t или методом, конвертируемым для значения этого типа. Представления применяются в двух ситуациях.
- Если выражение e имеет тип t, а т не соответствует к ожидаемому типу экспрессии PT. В этом случае неявное v ищется, что применимо к E и Чья тип результата соответствует к Pt. Поиск продолжается как в случае неявных параметров, где неявный объем - это один из t => pt. Если такой вид найден, выражение E преобразуется в V (E).
[...]
Учитывая вышеупомянутые и следующие факты:
Long
не подтипjava.lang.Comparable[Long]
, т.е. не соответствует печататьT
кудаT <: java.lang.Comaparable[Long]
Predef
содержитimplicit def longWrapper (x: Long) : RichLong
RichLong
это подтипjava.lang.Comparable[Long]
, т.е. соответствовать печататьT
кудаT <: java.lang.Comaparable[Long]
Я ожидал, что неявное преобразование применяется, где Long
встречается и подтип java.lang.Comparable[Long]
ожидается. Однако:
scala> def test[T <: java.lang.Comparable[Long]](c: T) = println(c)
test: [T <: java.lang.Comparable[Long]](c: T)Unit
scala> test(12L)
<console>:7: error: inferred type arguments [Long] do not conform to method test's type parameter bounds [T <: java.lang
.Comparable[Long]]
test(12L)
^
Результат, как ожидается, если значение будет конвертировано явно:
scala> test(longWrapper(12L))
12
Почему функция преобразования не применена неявно?
Решение
Вам нужно использовать визуальный (<%
) иметь компилятор искать и применить неявное преобразование.
scala> def test[T <% java.lang.Comparable[Long]](c: T) = println(c)
test: [T](c: T)(implicit evidence$1: (T) => java.lang.Comparable[Long])Unit
scala> test(12L)
12
Вы можете прочитать больше о связанных это страница (Ctrl + F для «View Country»).