неявное преобразование в компаньоне
объект источника или ожидаемый
целевые типы не должны быть
импортирован.
Достаточно верно. Теперь метод camelize
определен в классе MyString
, и, действительно, в его объектном компаньоне происходит неявное преобразование в MyString
. Однако в коде нет ничего, сообщающего компилятору, что MyString
является ожидаемым типом цели.
Если вместо этого вы написали это:
val x = ("active_record": MyString).camelize
тогда это будет работать, потому что компилятор будет знать, что вы ожидаете, что "active_record"
будет MyString
, что заставляет его искать неявное преобразование внутри объекта MyString
.
Это может выглядеть немного ограничительно, но на самом деле это работает во многих местах. Скажем, например, у вас было:
class Fraction(num: Int, denom: Int) {
...
def +(b: Fraction) = ...
...
}
А потом у вас был такой код:
val x: Fraction = ...
val y = x + 5
Теперь у x
есть метод +
, для которого ожидаемый тип равен Fraction
. Таким образом, здесь компилятор будет искать неявное преобразование из Int
в Fraction
внутри объекта Fraction
(и внутри объекта Int
, если он был, поскольку это тип источника).