kotlin 中的泛型、伴随对象和继承
Generics, companion object, and inheritance in kotlin
我正在 Android 上使用 ViewBindings,编译器从 xml 生成的代码看起来应该像这样
class ViewBinding {...}
class MyBinding : ViewBinding {
companion object {
fun inflate (...) {
...
}
}
}
为了避免 copy/pasting 代码,我想创建一个 class,接受 ViewBinding 的 class 子级作为泛型类型参数,并使用具有方法 inflate 的伴随对象.
class MyClass<T:ViewBinding having the method inflate in the companion object of the class> { ... }
最聪明的方法是什么?
事实上,你想做的事是不可能的。类型参数限制适用于类型本身,而不是它的伴随对象,它实际上与 class 无关(它被编译为一个单独的 class 与原始 [=22= 无关]). Java 等价物,从接口实现静态方法,也是不可能的。
然而,您可以做的是将伴随本身用作类型参数,伴随使用 inflate
方法实现接口:
interface ViewBindingCompanion {
fun inflate(): ViewBinding
}
class MyBinding : ViewBinding {
companion object : ViewBindingCompanion {
fun inflate(): ViewBinding {
...
}
}
}
class MyClass<T : ViewBindingCompanion>
然后:
MyClass<MyBinding.Companion>()
如果我遗漏了什么,请发表评论。
我正在 Android 上使用 ViewBindings,编译器从 xml 生成的代码看起来应该像这样
class ViewBinding {...}
class MyBinding : ViewBinding {
companion object {
fun inflate (...) {
...
}
}
}
为了避免 copy/pasting 代码,我想创建一个 class,接受 ViewBinding 的 class 子级作为泛型类型参数,并使用具有方法 inflate 的伴随对象.
class MyClass<T:ViewBinding having the method inflate in the companion object of the class> { ... }
最聪明的方法是什么?
事实上,你想做的事是不可能的。类型参数限制适用于类型本身,而不是它的伴随对象,它实际上与 class 无关(它被编译为一个单独的 class 与原始 [=22= 无关]). Java 等价物,从接口实现静态方法,也是不可能的。
然而,您可以做的是将伴随本身用作类型参数,伴随使用 inflate
方法实现接口:
interface ViewBindingCompanion {
fun inflate(): ViewBinding
}
class MyBinding : ViewBinding {
companion object : ViewBindingCompanion {
fun inflate(): ViewBinding {
...
}
}
}
class MyClass<T : ViewBindingCompanion>
然后:
MyClass<MyBinding.Companion>()
如果我遗漏了什么,请发表评论。