在转换Any类型的对象时未经检查的强制转换?进入kotlin的一个lambda

时间:2017-11-14 03:30:18

标签: lambda kotlin

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

cast Any! to lambda

忽略警告是否安全? 我知道Kotlin在运行时无法检查已删除的类型,但不是Kotlin中任何最通用的(顶级)对象。

我正在寻找的是一种检查某个对象是否属于" lambda"的方法。 顺便问一下:好吗? - >任何?也没有摆脱这个问题。

1 个答案:

答案 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语言的限制。如果您可以依赖于您所期望的类型,那么就没有错误,但是如果泛型参数与您期望的不同,则不会出现任何异常。

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