0

Я новичок в 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. Я не понимаю, как я могу обойти или избежать неявного преобразования.

Любые идеи будут оценены.

+0

hmm ... 'implicit' в Java? Если вы переводите его на Java, переведите его полностью. Вы не найдете простой способ использования implicits в Java. –

+0

Если ваш класс A имеет все методы RFunction, то они будут вызваны до того, как будет применено неявное преобразование. –

+0

Вы не можете. В некоторых местах кода, особенно во внешней библиотеке, статический тип некоторой переменной будет R, хотя во время выполнения это фактически A. Следовательно, неявное преобразование будет иметь место в любом случае независимо от того, что вы делаете, потому что компилятор не является всезнающим, чтобы вывести иначе. И действительно, нет никаких типизирующих отношений между RFunctions и R. Вы не можете «реализовать» методы RFunction из подкласса R, потому что они являются отдельными объектами, которые просто связаны методом конвертации. – HTNW

ответ

0

Продлить abstract class R с abstract class Rbis в Scala, и в компаньона object Rbis определить неявные функции, которые вам нужны (они будут вызываться перед теми, в R в нашем случае), то в Java вы расширяете Rbis.

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