Неявная функция в Scala не работает должным образом - PullRequest
3 голосов
/ 04 января 2012

Если я определяю следующую функцию, которая ожидает Long, и я определяю следующую неявную функцию, неявная функция используется, когда я передаю Date первой функции, и все работает как ожидалось:

def millisToDays(in: Long): Int = (in / (1000L * 3600L * 24L)).toInt
implicit def dateToLong(d: Date) = d.getTime
println(millisToDays(new Date))

Но для следующего второго примера я получаю ошибку компилятора в третьей строке: «Аргументы выводимого типа [Int] не соответствуют границам параметра типа метода mySum [t <: java.lang.Number]» </p>

def mySum[T <: Number](as: T*): Double = as.foldLeft(0d)(_ + _.doubleValue)
implicit def intToInteger(n: Int): Integer = new Integer(n.toInt)
var r = mySum(2, 3)

Что я сделал не так? Почему не используется неявная функция intToInteger?

Я предполагаю, что проблема в том, что неявная функция не возвращает "T <: Number", а скорее целое число, поэтому компилятор не может догадаться, что неявная функция действительно полезна. </p>

В любом случае, могу ли я дать компилятору подсказку, что он должен использовать неявную функцию?

Спасибо! Ant

1 Ответ

5 голосов
/ 04 января 2012

Границы типа [T <: Number] означают, что T должен быть подтипом из Number.Неявное преобразование из Int в Integer не дает вам этого, так как даже если преобразование доступно, это еще не означает, что Int является подтипом Number.

К счастью, есть нечто похожее, называемое границами представления, написанное [T <% Number], которое точно указывает, что вы хотите, что есть неявное преобразование, доступное из T в Number

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...