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>()

如果我遗漏了什么,请发表评论。