投掷任何types的对象时未经检查强制转换? 成kotlin lambda

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

施展任何!到lambda

忽视警告是否安全? 我知道Kotlin在运行时不能检查擦除types,但不是Kotlin中最通用的(顶级)对象。

我在找什么是一种方法来检查一个对象的types是“lambda”。 顺便说一句:任何? – >任何? 也没有摆脱这个问题。

JVM仅在运行时为您提供原始types,例如java.lang.List而不是java.lang.List 。 这也适用于kotlin lambdas:在kotlin中写入(Any?) -> Unit时,它将被转换为JVMtypeskotlin.jvm.functions.Function1

现在,你有一个Any?types的对象Any? 。 你可以写Any? as? Function1<*, *> Any? as? Function1<*, *> Any? as? Function1<*, *>没有任何问题。 你也可以用as而不是as? 但是有ClassCastException风险。

但现在出现了这样的问题:types(Any?) -> Unit(Int) -> String在编译时是不同的types,只是因为它们的genericstypes参数。 在运行时,两者都是Function1实例,这就是为什么编译器在将其转换为除*其他generics参数的任何东西时会发出警告的原因。

忽视警告是否安全?

如果你知道你在做什么 – 是的,这只是Java语言的限制。 如果你可以依赖于你期望的types,那么就没有错误,但是如果generics参数与你所期望的不同,你将不会得到任何exception。

如果你不知道自己在做什么,例如从你无法控制的代码中获取参数 – 严肃地对待这个警告。