投掷任何types的对象时未经检查强制转换? 成kotlin 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。
如果你不知道自己在做什么,例如从你无法控制的代码中获取参数 – 严肃地对待这个警告。