я написал следующую очень простую программу, которую я должен работать нормально:Неявные преобразования и неявные классов
object Main {
def main(args: Array[String]) = {
val mc1: MyClass = new MyClass(20);
val mc2: MyClass = 10
mc1.doSome //fine
mc2.doSome //fine
30.doSome //error. Cannot resolve symbol doSome
}
implicit def int2MyClass(i: Int): MyClass = new MyClass(i)
implicit class Tst(val mc: MyClass){
def doSome = println(mc.i)
}
}
class MyClass(val i: Int)
Но, к сожалению, это не так. Ошибка была вызвана неявным преобразованием, которое не удалось преобразовать 30
в MyClass(30)
. Зачем? Что в этом плохого?
объявить неявное перед использованием, если в том же файле – cchantep
FYI, он компилируется, изменяя '30.doSome' на' (30: MyClass) .doSome'. Я не знаю почему! Кажется, что компилятор применяет implicits один раз, если вы явно не укажете тип. –
Как отметил @IdanWaisman, Scala не допускает укладки/привязки имплицитов. Это, по замыслу, одноразовый механизм. – jwvh