Generics 如何在伴生对象中使用泛型

Generics 如何在伴生对象中使用泛型,generics,kotlin,Generics,Kotlin,我希望以这种方式在companion对象中使用泛型: class Foo<T> { /* ... */ companion object { fun foo(args: List<T>) { /* ... */ } } } class-Foo{ /* ... */ 伴星{ fun-foo(args:List){ /* ... */ } } } 不幸的是,上面的代码引发了未解析引用:T错误。

我希望以这种方式在companion对象中使用泛型:

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

不幸的是,上面的代码引发了
未解析引用:T
错误。

您需要像这样声明泛型

fun <T> foo(args: List<T>) { ... }
funfoo(args:List){…}
或者,如果你不在乎类型,你可以使用星体投影

fun foo(args: List<*>) { ... }
funfoo(args:List){…}
共享伴生对象 类的泛型类型参数不允许在伴随对象内。原因是,在该类的所有实例中共享一个
伴生对象。对于同一类的不同参数化类型也是如此。因此,例如,
伴生对象
无论是
Foo
还是
Foo
都是相同的。换句话说,封闭类的
T
伴随对象内不能采用不同的形式
String
Int

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


最接近的可能解决方案 可以在伴生对象内为函数定义单独的类型参数:

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


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

我已经在类名中声明了,但是。。再次声明到同伴对象同伴对象(像任何对象一样)不能是泛型的。记住,companion对象是针对类本身的,而不是针对类的实例。@ruckus同样针对类,如果我将抽象类泛型类型定义为
抽象类AbstractClass
,则我无法定义一个继承抽象类的类(first),该类具有可以使用(first)类的companion。因此,我仍然无法抽象地使用companion返回(第一)类类型
val instance = Foo<String>()
Foo.foo(listOf<String>())