Я новичок в Scala и неявных преобразованиях.Как переопределить неявную функцию объекта-компаньона?
Я работаю с существующей библиотекой scala, над которой у меня нет контроля. Давайте рассмотрим класс R из библиотеки.
abstract class R {
}
object R {
implicit def RFunctions[K, V](r: R[(K, V)]) (implicit kt: ClassTag[K],vt: ClassTag[V], ord: Ordering[K] = null): RFunctions[K, V] = { new RFunctions(r) }
}
Я расширяю класс R, чтобы переопределить почти все его поведение. Но этот новый класс является Java-классом. Давайте назовем это А.
class A extends R {
}
Проблема заключается в том, в какой-то момент в моем потоке управления, управление переходит к неявной декларации для R и в конечном итоге с помощью класса RFunctions для любой функциональности.
Методы, которые присутствуют в RFunctions, также реализованы в моем расширенном классе A. Я не понимаю, как я могу обойти или избежать неявного преобразования.
Любые идеи будут оценены.
hmm ... 'implicit' в Java? Если вы переводите его на Java, переведите его полностью. Вы не найдете простой способ использования implicits в Java. –
Если ваш класс A имеет все методы RFunction, то они будут вызваны до того, как будет применено неявное преобразование. –
Вы не можете. В некоторых местах кода, особенно во внешней библиотеке, статический тип некоторой переменной будет R, хотя во время выполнения это фактически A. Следовательно, неявное преобразование будет иметь место в любом случае независимо от того, что вы делаете, потому что компилятор не является всезнающим, чтобы вывести иначе. И действительно, нет никаких типизирующих отношений между RFunctions и R. Вы не можете «реализовать» методы RFunction из подкласса R, потому что они являются отдельными объектами, которые просто связаны методом конвертации. – HTNW