【问题标题】:Generics, companion object, and inheritance in kotlinkotlin 中的泛型、伴生对象和继承
【发布时间】:2021-03-25 10:31:10
【问题描述】:

我正在 Android 上使用 ViewBindings,编译器从 xml 生成的代码必须看起来像这样

class ViewBinding {...}

class MyBinding : ViewBinding {
    companion object {
        fun inflate (...) { 
            ...
        }
    }
}

为避免复制/粘贴代码,我想创建一个类,接受 ViewBinding 的子类作为泛型类型参数,并使用具有方法 inflate 的伴随对象。

class MyClass<T:ViewBinding having the method inflate in the companion object of the class> { ... }

最聪明的方法是什么?

【问题讨论】:

  • 需要更多关于你想要做什么的细节。什么是 MyClass?您的 ViewBinding 的子类,您的 ViewBinding 的某种包装器,还是别的什么?

标签: android kotlin generics inheritance companion-object


【解决方案1】:

事实上,你想要做的事情是不可能的。类型参数限制适用于类型本身,而不是它的伴随对象,它实际上与类无关(它被编译为与原始类无关的单独类)。从接口实现静态方法的 Java 等价物也是不可能的。

但是,您可以做的是使用伴随程序本身作为类型参数,伴随程序使用inflate 方法实现接口:

interface ViewBindingCompanion {
    fun inflate(): ViewBinding
}

class MyBinding : ViewBinding {
    companion object : ViewBindingCompanion {
        fun inflate(): ViewBinding { 
            ...
        }
    }
}

class MyClass<T : ViewBindingCompanion>

然后:

MyClass<MyBinding.Companion>()

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

【讨论】:

  • 我绝对会尝试,如果可行的话,这是解决问题的聪明方法! tyvm
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多