Существует ли способ управлять, какое неявное преобразование будет используемым значением по умолчанию?

Предположим, что у меня есть это:

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 объект и работа над этим?

Я признаю, что пример кода не может наиболее подходить (для этого вопроса), но я думаю, что он сделает.

20
задан Geo 11 December 2009 в 09:48
поделиться

1 ответ

В Scala 2.8 добавлена ​​система приоритизации имплицитов. Это объясняется в этом протоколе SIP для новых массивов Java :

При сравнении двух разных применимых альтернатив перегруженного метода или неявного метода каждый метод получает один балл за наличие более конкретных аргументов и еще один балл за определяется в соответствующем подклассе. Альтернатива «выигрывает» над другой, если она получает большее количество баллов в этих двух сравнениях

, делая вывод, что , если альтернативы имеют идентичные типы аргументов, тот, который определен в подклассе выигрывает . Следовательно, я считаю, что вы могли бы объявить имплицит следующим образом:

trait LowPriorityImplicits {
  //lower priority conversions
}

object HighPriorityImplicits extends LowPriorityImplicits {
  //higher-order ones here
}
34
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: