Lambda 是否在强制转换任何类型的对象时取消选中强制转换?进入科特林的一个兰姆达

Lambda 是否在强制转换任何类型的对象时取消选中强制转换?进入科特林的一个兰姆达,lambda,kotlin,Lambda,Kotlin,我的代码按预期工作,但我很好奇为什么会出现以下警告: 忽略警告安全吗? 我知道Kotlin不能在运行时检查已擦除的类型,但它不是Kotlin中最通用的顶级对象 我要寻找的是一种检查对象是否为lambda类型的方法。 顺便说一句:有吗?->任何也不能解决这个问题。JVM在运行时只提供原始类型,例如java.lang.List而不是java.lang.List。这也适用于kotlin lambdas:当您编写任何内容时?->在kotlin中,它被转换为JVM类型kotlin.JVM.function

我的代码按预期工作,但我很好奇为什么会出现以下警告:

忽略警告安全吗? 我知道Kotlin不能在运行时检查已擦除的类型,但它不是Kotlin中最通用的顶级对象

我要寻找的是一种检查对象是否为lambda类型的方法。
顺便说一句:有吗?->任何也不能解决这个问题。

JVM在运行时只提供原始类型,例如java.lang.List而不是java.lang.List。这也适用于kotlin lambdas:当您编写任何内容时?->在kotlin中,它被转换为JVM类型kotlin.JVM.functions.Function1

现在,您有一个类型为Any?的对象?。你会写什么?像功能1没有任何问题。您也可以使用as而不是as?,但要冒抛出ClassCastException的风险

但现在问题来了:类型有吗?->Unit和Int->String在编译时是不同的类型,但这只是因为它们的泛型类型参数。在运行时,两者都是Function1的实例,这就是为什么当您将其强制转换为除*以外的任何通用参数时,编译器将发出警告

忽略警告安全吗

如果您知道自己在做什么——是的,这只是Java语言的局限性。如果您可以依赖于您所期望的类型,则不会出现错误,但是如果泛型参数与您所期望的不同,则不会出现任何异常


如果您不知道自己在做什么,例如从无法控制的代码中获取参数,请认真对待此警告。

感谢您的明确解释。我控制代码,我希望fixAUd始终是lambda表达式,或者在最坏的情况下,null@feresr但是,如果它总是lambda或null,那么您到底为什么需要强制转换?为了能够调用它,我正在实现一个接口,参数fixAUd的类型是Any?,无法更改它。我所能做的就是确保始终将lambda作为参数传递。