我有一个带有通用参数的方法 foo<T>
需要传递给Object
消费 bar 方法。为什么我们需要强制转换为Object
,一切都扩展Object
?
fun <T> foo(arg:T) {
bar(arg) //doesn't compile
bar(arg as Object) //compiles only with cast to Object
}
fun bar(x:Object){}
您尚未为 指定任何上限T
。因此使用隐含的上限:T: Any?
。
该函数bar()
采用Object
并且Any?
与它不兼容。Object
是 的一种特定子类型Any?
。
的另一个特定子类型Any?
是Int
并且它也不是 的子类型Object
。不可为 nullInt
编译为 JVM 原始类型int
,这显然不是 的实例Object
。
最后,您应该重新考虑Object
在 Kotlin 中的任何地方的使用;我的 IDE 立即用警告标记它。所以,声明
fun bar(x: Any?) { }
或者,如果您想强制执行不可空性,
fun bar(x: Any) { }
在后一种情况下,您还必须限制 的上限T
:
fun <T: Any> foo(arg: T) { ... }
但是,您发布的示例代码甚至没有激发通用参数T
,因此您可能只需要
fun foo(x: Any) { ... }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句