2013-03-25 6 views
2

Книга «Программирование в 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]?

+1

Я бы сказал, да, но читать спецификации Scala языка, он идет на большие длины, чтобы объяснить неявное разрешение конфликтов :-) – Felix

+0

Похоже, что я должен буду. Спасибо за предложение :) –

ответ

1

Из спецификации Scala языка:

Если есть несколько правомочных аргументов, которые соответствуют типу неявным параметра, наиболее специфичные один будет выбрана с помощью правила статического разрешения перегрузки (§6.26.3). Если параметр имеет аргумент по умолчанию, и не может быть найден неявный аргумент, используется аргумент по умолчанию.

http://www.scala-lang.org/docu/files/ScalaReference.pdf

Смежные вопросы