Проблема заключается в том, что оба метода после компиляции будут иметь одинаковую базовую сигнатуру. Это связано с тем, что концепция обобщений существует только во время компиляции - если вы проверяете байт-код, нет 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)
Следовательно, ошибка компиляции, если вы попытаетесь использовать оба в одном классе.