我有一个带有泛型参数<T>
的方法foo,需要传递给Object
消费条方法。为什么我们需要转换为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){}
答案 0 :(得分:5)
您尚未为T
指定任何上限。因此使用隐含的上限:T: Any?
。
功能bar()
需要Object
,而Any?
与其分配兼容。 Object
是Any?
的一个特定子类型。
Any?
的另一个特定子类型是Int
,它也不是Object
的子类型。不可为空的Int
编译为JVM基元类型int
,它显然不是Object
的实例。
最后,你应该重新考虑Kotlin任何地方Object
的使用情况;我的IDE会立即用警告标记它。所以,声明
fun bar(x: Any?) { }
或者,如果你想强制执行非空性,
fun bar(x: Any) { }
在后一种情况下,您还必须约束T
的上限:
fun <T: Any> foo(arg: T) { ... }
但是,您发布的示例代码甚至没有激发通用参数T
,因此您可能只需要
fun foo(x: Any) { ... }