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

Chr*_*iss 0 generics kotlin

我有一个带有泛型参数的方法foo <T>,需要传递给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){} 
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 5

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

该功能bar()需要一个ObjectAny?不分配兼容它.Object是一个特定的亚型Any?.

另一个特定的子类型Any?Int,它也不是它的子类型Object.不可为空的可Int编译为JVM基元类型int,它显然不是实例Object.

最后,你应该重新考虑ObjectKotlin任何地方的用法; 我的IDE会立即用警告标记它.所以,宣布

fun bar(x: Any?) { }
Run Code Online (Sandbox Code Playgroud)

或者,如果你想强制执行不可违约性,

fun bar(x: Any) { }
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,您还必须约束上限T:

fun <T: Any> foo(arg: T) { ... }
Run Code Online (Sandbox Code Playgroud)

但是,您发布的示例代码甚至没有激发泛型参数T,因此您可能只需要

fun foo(x: Any) { ... }
Run Code Online (Sandbox Code Playgroud)