我有一个接口,该接口还有一个方法将相应的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。
任何帮助将不胜感激:^)。
答案 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)
因此,如果您尝试将两者都放在同一个类中,则会出现编译错误。