Scala 2.8 спецификации сказано в разделе 7.3 (выделение мое):Почему неявное преобразование из Long в RichLong не применяется там, где ожидается супертип RichLong?
неявные параметры и методы могут также определить неявные преобразования, называемые видами. Вид из типа S в тип T определяется неявным значением, которое имеет тип функции S => T или (=> S) => T или методом, конвертируемым в значение этого типа. Представления применяются в двух ситуациях.
- Если выражение е типа Т и Т не соответствует к ожидаемого типа пт выражения. В этом случае выполняется поиск неявного 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
Почему функция преобразования не применяется неявно?
Спасибо, вам нужно будет читать по границам типа, по-видимому! –