如何将泛型参数传递给Object使用方法?

时间:2018-05-17 08:40:17

标签: generics kotlin

我有一个带有泛型参数<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){} 

1 个答案:

答案 0 :(得分:5)

您尚未为T指定任何上限。因此使用隐含的上限:T: Any?

功能bar()需要Object,而Any?与其分配兼容。 ObjectAny?的一个特定子类型。

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) { ... }