перегрузка функций в интерфейсах отличается по универсальным - PullRequest
0 голосов
/ 21 мая 2019

У меня есть интерфейс, в котором есть метод, который отправляет соответствующий объект Throwable в лямбду (обработчик).

Из-за характера лямбды он не принимает ни один объект (наследуемый), кромеуказан явный тип.

Поэтому мне пришлось создать еще одну функцию, которая передает соответствующую ошибку обработчику, а при отсутствии обработчика просто подавляет эти Throwables.

fun <T: Throwable> otherwise(onRejected: (T) -> Any?): MyInterface<Any>

fun otherwise(onRejected: (Throwable) -> Any?): MyInterface<Any>

Но даже однаиспользует generic, а другой просто принимает Throwable, компилятор жалуется на то, что The following declarations have the same JVM signature.

Я хотел бы сделать обработчик по умолчанию и основной обработчик, который имеет generic для передачи только запрашиваемого Throwable.

Буду признателен за любую помощь: ^).

1 Ответ

0 голосов
/ 21 мая 2019

Проблема заключается в том, что оба метода после компиляции будут иметь одинаковую базовую сигнатуру. Это связано с тем, что концепция обобщений существует только во время компиляции - если вы проверяете байт-код, нет T.

Обе версии otherwise используют лямбду, которая скомпилирована в Function1 - интерфейс, который использует обобщенные элементы, которые стираются в байт-коде, и поскольку информация об обобщенных элементах стирается в байт-коде, у вас будет следующее:

fun otherwise(onRejected: (Throwable) -> Any?): MyInterface<Any> компилируется в:

public static final MyInterface otherwise(@NotNull Function1 onRejected)

fun <T: Throwable> otherwise(onRejected: (T) -> Any?): MyInterface<Any> компилируется в:

public static final MyInterface otherwise(@NotNull Function1 onRejected)

Следовательно, ошибка компиляции, если вы попытаетесь использовать оба в одном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...