2016-11-18 2 views
0

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

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) 

DEMO

Но, к сожалению, это не так. Ошибка была вызвана неявным преобразованием, которое не удалось преобразовать 30 в MyClass(30). Зачем? Что в этом плохого?

+0

объявить неявное перед использованием, если в том же файле – cchantep

+0

FYI, он компилируется, изменяя '30.doSome' на' (30: MyClass) .doSome'. Я не знаю почему! Кажется, что компилятор применяет implicits один раз, если вы явно не укажете тип. –

+1

Как отметил @IdanWaisman, Scala не допускает укладки/привязки имплицитов. Это, по замыслу, одноразовый механизм. – jwvh

ответ

2

Когда вы 30.doSome Scala компилятор ищет метод в Int, если не найден, то это выглядит для implicit class объявить о Int. Но, к сожалению, implicit class объявлен на myClass.

Для того, чтобы заставить его работать помочь компилятору с явным типом

(30: MyClass).doSome 
1

Я подозреваю, this может быть проблемой.

Смежные вопросы