Следующий Scala код работает правильно:Столкновение implicits в Scala
val str1 = "hallo"
val str2 = "huhu"
val zipped: IndexedSeq[(Char, Char)] = str1.zip(str2)
Однако, если я импортировать неявного метода
implicit def stringToNode(str: String): xml.Node = new xml.Text(str)
затем Scala (2,10) компилятор выдает ошибку: value zip is not a member of String
Кажется, что наличие stringToNode
каким-то образом блокирует неявное преобразование str1
и str2
- WrappedString
. Зачем? И есть способ изменить stringToNode
так, что zip
работает, но stringToNode
по-прежнему используется, когда я вызываю функцию, которая требует аргумента Node
с String
?
Спасибо! Есть ли способ избежать этой двусмысленности? Могу ли я представить какие-то предпочтения? –
Я думаю, что вы столкнетесь с проблемой, что Predef всегда в области видимости, поэтому, если вы вызываете метод, который существует как для StringOps, так и для xml.Node, компилятор не сможет выбрать соответствующий имплицитный. Вы можете попробовать иметь stringToNode в области видимости и сделать это: val x: xml.Node = "whatever-xml-thing", и посмотреть, будет ли это срабатывать. Но тогда вы не сможете использовать zip в текущей области! – Felix