如何使Kotlin泛型方法静态化?

时间:2019-06-25 12:38:22

标签: generics kotlin static

我知道可以用Java编写静态通用方法。

我试图在Kotlin中实现自己的解决方案,但失败了。

class Wrapper<T>
{
    companion object <T> // error: Type parameters are not allowed for objects.
    {
        private var value: T? = null

        // implement some methods
    }
}

有什么方法可以在Kotlin中实现静态泛型方法吗?

4 个答案:

答案 0 :(得分:3)

companion object不是方法。实际上,它是object类的同伴Wrapper,因此它无法识别父类的通用类型。 同样适用于Java:

public class Wrapper<T> {
    public static T value; //ERROR
}

在此companion object中,您可以声明将在Java世界中成为static的方法和字段。

class Wrapper<T>
{
    companion object
    {
        fun <T> genericMethod(){

        }
    }
}

但是请记住,Wrapper<T>的类型与T中的fun <T> genericMethod()类型没有关联。

答案 1 :(得分:2)

对于Kotlin,静态(顶层,同伴)和实例函数/方法之间没有区别。因此,相同的通用函数/方法

fun <T> something() {
    // TODO
}

在类主体中,顶级以及伴随或对象声明中均有效。

答案 2 :(得分:0)

您只需要指定函数的泛型类型参数即可。函数的位置无关紧要,无论是类,文件,伴随对象等。
伴随对象的示例:

companion object {
    fun <T> generic(t: T) {
        // do something generic
    }
}

答案 3 :(得分:0)

伴侣对象是一个单例

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

类型参数只能与类的成员函数和成员属性一起使用。您示例中的 value 属性不是 Wrapper 类的成员,而是 companion object 的成员。

这和说的一样:

class Wrapper<T> {
    class SomeOtherClass<T> {
        private var value: T? = null
        // implement some methods
    }
}

区别仅在于 SomeOtherClass 的单个对象与多个对象。 T 对于 WrapperSomeOtherClass 是独立的。


就是这样!希望能为您解决的实际问题指明正确的方向。