Почему неявное преобразование от долгого до Ричлонга не применяется, где ожидается супертип Ричлонга?

StackOverflow https://stackoverflow.com/questions/3586044

  •  01-10-2019
  •  | 
  •  

Вопрос

Scala 2.8 Спец говорит, что в разделе 7.3 (выделение является моим):

Неявные параметры и методы также могут определить неявные преобразования, называемые видами. Взгляд от типа S для типа T определяется неявному значению, которое имеет тип функции s => t или (=> s) => t или методом, конвертируемым для значения этого типа. Представления применяются в двух ситуациях.

  1. Если выражение e имеет тип t, а т не соответствует к ожидаемому типу экспрессии PT. В этом случае неявное v ищется, что применимо к E и Чья тип результата соответствует к Pt. Поиск продолжается как в случае неявных параметров, где неявный объем - это один из t => pt. Если такой вид найден, выражение E преобразуется в V (E).

[...]

Учитывая вышеупомянутые и следующие факты:

  1. Long не подтип java.lang.Comparable[Long], т.е. не соответствует печатать T куда T <: java.lang.Comaparable[Long]
  2. Predef содержит implicit def longWrapper (x: Long) : RichLong
  3. 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»).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top