我的代码按预期工作,但我很好奇为什么存在以下警告:
忽略警告是否安全? 我知道Kotlin在运行时无法检查已删除的类型,但不是Kotlin中任何最通用的(顶级)对象。
我正在寻找的是一种检查某个对象是否属于" lambda"的方法。 顺便问一下:好吗? - >任何?也没有摆脱这个问题。
答案 0 :(得分:1)
JVM仅在运行时为您提供原始类型,例如: java.lang.List
代替java.lang.List<String>
。这也适用于kotlin lambdas:当您在kotlin中编写(Any?) -> Unit
时,它会被转换为JVM类型kotlin.jvm.functions.Function1<java.lang.Object, kotlin.Unit>
。
现在,您有一个Any?
类型的对象。您可以毫无问题地编写Any? as? Function1<*, *>
。您也可以使用as
代替as?
,但可能会引发ClassCastException
。
但现在出现问题:类型(Any?) -> Unit
和(Int) -> String
在编译时是不同的类型,但仅仅是因为它们的泛型类型参数。在运行时,两者都是Function1
的实例,这就是编译器在将其强制转换为除*
以外的泛型参数的任何内容时发出警告的原因。
忽略警告是否安全?
如果您知道自己在做什么 - 是的,这只是Java语言的限制。如果您可以依赖于您所期望的类型,那么就没有错误,但是如果泛型参数与您期望的不同,则不会出现任何异常。
如果您不知道自己在做什么,例如从无法控制的代码中获取参数 - 严肃对待此警告。