Дженерики, сопутствующий объект и наследование в kotlin

Я работаю с 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> { ... }

Какой самый умный способ сделать это?

Нужно больше подробностей о том, что вы пытаетесь сделать. Что такое MyClass? Подкласс вашего ViewBinding, какая-то оболочка для вашего ViewBinding или что-то еще?

Tenfour04 14.12.2020 20:05
0
1
671
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как бы то ни было, то, что вы пытаетесь сделать, невозможно. Ограничения параметра типа применяются к самому типу, а не к его сопутствующему объекту, который на самом деле не связан с классом (он компилируется как отдельный класс, не имеющий отношения к исходному классу). Эквивалент Java, реализующий статический метод из интерфейса, также невозможен.

Однако вы можете использовать сам компаньон в качестве параметра типа, компаньон реализует интерфейс с помощью метода inflate:

interface ViewBindingCompanion {
    fun inflate(): ViewBinding
}

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

class MyClass<T : ViewBindingCompanion>

А потом:

MyClass<MyBinding.Companion>()

Оставьте комментарий, если я что-то пропустил.

Я обязательно попробую это, это умный способ решить проблему, если он работает! тывм

Pylvain 14.12.2020 21:16

Другие вопросы по теме