Ссылка на универсальную функцию расширения приемника с несколькими границами в Kotlin

Имеет функцию расширения

fun <T> T.doSomething() where T: A, T: B

Если есть только одна общая привязка A, я могу использовать синтаксис (A::doSomething)(instanceOfA) для ссылки на функцию, но как это сделать с несколькими границами?


Пример:

interface A, interface B и функция расширения, связанная с обоими интерфейсами fun <T> T.doSomething() where T: A, T: B.

Теперь мне удается "переопределить" doSomething, если класс расширяет дополнительные interface C, например class X: A, B, C:

  1. Объявить другую функцию расширения fun <T> T.doSomething() where T: A, T: B, T: C
  2. Объявить doSomething() внутри класса X

Если я использую doSomething() в обеих функциях "переопределения", это вызовет бесконечную рекурсию. Как я могу сослаться на исходный fun <T> T.doSomething() where T: A, T: B (например, super.doSomething())?


person Zouyiu Ng    schedule 24.01.2019    source источник
comment
Пожалуйста, дайте наглядный пример того, чего вы хотите достичь. откуда берутся A и B?   -  person Willi Mentzel    schedule 25.01.2019


Ответы (1)


Немного некрасиво, но

fun <T> T.doSomething() where T: A, T: B = ...

// calls the first version of doSomething
fun <T> T.doSomethingHelper() where T: A, T: B = this.doSomething()

@JvmName("doSomethingElse")
fun <T> T.doSomething() where T: A, T: B, T: C = ... // use doSomethingHelper() here

Без @JvmName я получаю

java.lang.ClassFormatError: повторяющееся имя и подпись метода в файле класса Simplest_versionKt

person Alexey Romanov    schedule 25.01.2019