接口中的功能过载在通用量方面有所不同



我有一个接口,否则它的方法将相应的可投掷对象发送到lambda(处理程序(。

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

因此,我必须创建另一个功能,该功能向处理程序提供相应的错误,而当没有处理程序时,只需抑制那些可抛弃的物品。

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

,但即使是一个人都使用通用,另一个人只需投掷,编译器就投诉了The following declarations have the same JVM signature

我想制作一个默认处理程序和一个主要处理程序,该处理程序只能通过他们提出的可投掷。

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

问题是,两种方法在编译后都具有相同的基础签名。这是因为仿制药的概念仅在编译时间存在 - 如果您检查字节码,则没有T

otherwise的两个版本都要拿一个lambda,该lambda汇编为Function1 - 使用仿制药的界面,该界面在bytecode中被删除 - 并且由于在字节上删除了有关仿制药的信息,因此您将有以下内容:

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)

因此,如果您尝试在同一类中都有两个。

最新更新