如何在伴侣对象中使用泛型

时间:2017-11-02 21:07:00

标签: generics kotlin

我想以这种方式在伴侣对象中使用泛型:

class Foo<T> {
    /* ... */
    companion object {
        fun foo(args: List<T>) {
            /* ... */
        }
    }
}

不幸的是,上面的代码会引发Unresolved reference: T错误。

2 个答案:

答案 0 :(得分:9)

您需要像这样声明通用

fun <T> foo(args: List<T>) { ... }

或者,如果您不关心类型,可以使用星形投影

fun foo(args: List<*>) { ... }

答案 1 :(得分:0)

同伴对象是共享的

在伴生对象中不允许类的通用类型参数。原因是单个 companion object 在该类的所有实例之间共享。对于同一类的不同参数化类型也是如此。因此,例如,无论是 companion object 还是 Foo<String>Foo<Int> 都是相同的。换句话说,封闭类的 T 不能在 String 中采用不同的形式 Intcompanion object

类型参数只能与类的成员函数和成员属性一起使用。


最接近的解决方案

您可以为伴随对象内的函数定义一个单独的类型参数:

class Foo<T> {
    /* ... */
    companion object {
        fun <T> foo(args: List<T>) {
            /* ... */
        }
    }
}

在这种情况下,TFooTfoo() 是独立的,需要单独实例化:

val instance = Foo<String>()
Foo.foo(listOf<String>())

就是这样!希望有助于理解这个概念。