接口中的函数重载在泛型中有所不同

时间:2019-05-21 09:36:27

标签: function kotlin

我有一个接口,该接口还有一个方法将相应的Throwable对象发送到lambda(处理程序)。

由于lambda的性质,除指定的显式类型外,它不接受任何对象(继承的对象)。

所以我不得不创建另一个函数,该函数将相应的错误提供给处理程序,并且当没有处理程序时,只需抑制那些Throwables。

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

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

但是,即使有人使用泛型而另一人使用Throwable,编译器也会抱怨The following declarations have the same JVM signature

我想创建一个默认处理程序和一个主处理程序,该处理程序具有泛型,只能传递他们要求的Throwable。

任何帮助将不胜感激:^)。

1 个答案:

答案 0 :(得分:0)

问题在于,两种方法在编译后将具有相同的基础签名。这是因为泛型的概念仅在编译时存在–如果检查字节码,则没有T

两个版本的otherwise都使用一个lambda,该lambda会编译为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)

因此,如果您尝试将两者都放在同一个类中,则会出现编译错误。