Я работаю с ViewBindings на Android с кодом, сгенерированным компилятором из 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> { ... }
Какой самый умный способ сделать это?
Как бы то ни было, то, что вы пытаетесь сделать, невозможно. Ограничения параметра типа применяются к самому типу, а не к его сопутствующему объекту, который на самом деле не связан с классом (он компилируется как отдельный класс, не имеющий отношения к исходному классу). Эквивалент Java, реализующий статический метод из интерфейса, также невозможен.
Однако вы можете использовать сам компаньон в качестве параметра типа, компаньон реализует интерфейс с помощью метода inflate
:
interface ViewBindingCompanion {
fun inflate(): ViewBinding
}
class MyBinding : ViewBinding {
companion object : ViewBindingCompanion {
fun inflate(): ViewBinding {
...
}
}
}
class MyClass<T : ViewBindingCompanion>
А потом:
MyClass<MyBinding.Companion>()
Оставьте комментарий, если я что-то пропустил.
Я обязательно попробую это, это умный способ решить проблему, если он работает! тывм
Нужно больше подробностей о том, что вы пытаетесь сделать. Что такое MyClass? Подкласс вашего ViewBinding, какая-то оболочка для вашего ViewBinding или что-то еще?