Книга «Программирование в Scala» указывает:Scala: когда несколько неявные преобразования применяются
вверх через Scala 2.7, это был конец истории. Когда применяется несколько неявных преобразований, компилятор отказался выбирать между . ... Scala 2.8 ослабляет это правило. Если одно из доступных преобразований строго больше, чем другие, тогда компилятор выберет более конкретный . ... одно неявное преобразование является более конкретным, чем другое , если выполнено одно из следующих утверждений:
• Тип аргумента первого является подтипом последнего.
Рассмотрим следующий случай:
object Encoder {
implicit def fromInt(x: => Int) = { println("int"); new Encoder }
implicit def fromIntArray(x: => Array[Int]) = { println("int array"); new Encoder }
implicit def fromGenericArray[T](x: => Array[T])(implicit subencoder: (=> T) => Encoder) = {
println("generic array")
subencoder(x(0))
new Encoder
}
}
val e: Encoder = Array(1)
Множественные преобразования могут применяться здесь, но мне кажется, что fromIntArray подобран. Когда fromIntArray нет, из GenericArray выбрано. Мой вопрос в том, является ли этот конкретный случай, когда применяется правило выше, чтобы я мог надежно ожидать, что fromIntArray будет применяться для Array [Int] и fromGenericArray для всех остальных Array [T]?
Я бы сказал, да, но читать спецификации Scala языка, он идет на большие длины, чтобы объяснить неявное разрешение конфликтов :-) – Felix
Похоже, что я должен буду. Спасибо за предложение :) –