Предположим, что у меня есть это:
class String2(val x:String) {
def *(times:Int) : String = {
val builder = new StringBuilder()
for( i <- 0 until times) {
builder.append(x)
}
builder.toString()
}
}
теперь, если я добавляю это неявное:
implicit def gimmeString2(y:String) = new String2(y)
Я получу ошибку компиляции, потому что stringWrapper также добавляет это неявное. Есть ли способ сказать компилятору, "игнорируют другой implicits, используют это", так, чтобы я не инстанцировал a String2
объект и работа над этим?
Я признаю, что пример кода не может наиболее подходить (для этого вопроса), но я думаю, что он сделает.
В Scala 2.8 добавлена система приоритизации имплицитов. Это объясняется в этом протоколе SIP для новых массивов Java :
При сравнении двух разных применимых альтернатив перегруженного метода или неявного метода каждый метод получает один балл за наличие более конкретных аргументов и еще один балл за определяется в соответствующем подклассе. Альтернатива «выигрывает» над другой, если она получает большее количество баллов в этих двух сравнениях
, делая вывод, что , если альтернативы имеют идентичные типы аргументов, тот, который определен в подклассе выигрывает . Следовательно, я считаю, что вы могли бы объявить имплицит следующим образом:
trait LowPriorityImplicits {
//lower priority conversions
}
object HighPriorityImplicits extends LowPriorityImplicits {
//higher-order ones here
}