我想以这种方式在伴侣对象中使用泛型:
class Foo<T> {
/* ... */
companion object {
fun foo(args: List<T>) {
/* ... */
}
}
}
不幸的是,上面的代码会引发Unresolved reference: T
错误。
答案 0 :(得分:9)
您需要像这样声明通用
fun <T> foo(args: List<T>) { ... }
或者,如果您不关心类型,可以使用星形投影
fun foo(args: List<*>) { ... }
答案 1 :(得分:0)
在伴生对象中不允许类的通用类型参数。原因是单个 companion object
在该类的所有实例之间共享。对于同一类的不同参数化类型也是如此。因此,例如,无论是 companion object
还是 Foo<String>
,Foo<Int>
都是相同的。换句话说,封闭类的 T
不能在 String
中采用不同的形式 Int
或 companion object
。
类型参数只能与类的成员函数和成员属性一起使用。
您可以为伴随对象内的函数定义一个单独的类型参数:
class Foo<T> {
/* ... */
companion object {
fun <T> foo(args: List<T>) {
/* ... */
}
}
}
在这种情况下,T
的 Foo
和 T
的 foo()
是独立的,需要单独实例化:
val instance = Foo<String>()
Foo.foo(listOf<String>())
就是这样!希望有助于理解这个概念。