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

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

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 также добавляет это неявное. Есть ли способ сказать компилятору "игнорировать другие импликации, использовать это", так что мне не нужно создавать экземпляр объекта String2 и работать над этим?

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

Ответы

Ответ 1

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

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

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

trait LowPriorityImplicits {
  //lower priority conversions
}

object HighPriorityImplicits extends LowPriorityImplicits {
  //higher-order ones here
}