我知道可以用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中实现静态泛型方法吗?
答案 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
中采用不同的形式 Int
或 companion object
。
类型参数只能与类的成员函数和成员属性一起使用。您示例中的 value
属性不是 Wrapper
类的成员,而是 companion object
的成员。
这和说的一样:
class Wrapper<T> {
class SomeOtherClass<T> {
private var value: T? = null
// implement some methods
}
}
区别仅在于 SomeOtherClass
的单个对象与多个对象。 T
对于 Wrapper
和 SomeOtherClass
是独立的。
就是这样!希望能为您解决的实际问题指明正确的方向。