Бережливые типы как универсальные

Я использую Apache thrift, который генерирует классы Java, которые выглядят следующим образом:

public class MyEvent implements org.apache.thrift.TBase<MyEvent, MyEvent._Fields>

Я хотел бы создать класс-контейнер, который принимает универсальный код, реализующий TBase. Я хотел бы написать код, который выглядит так:

(котлин)

val msg = MyContainer<MyEvent>()

Однако я не могу сделать class MyContainer<T: TBase>, так как мне нужно заполнить два аргумента для TBase, я сделал что-то вроде этого:

class MyContainer<T: TBase<T,F>, F: TFieldIdEnum>

Однако для этого мне нужно написать такой код:

val msg = MyContainer<MyEvent, MyEvent._Fields>()

который, я полагаю, работает и в противном случае дает мне необходимую функциональность, но в любом случае я могу более кратко сказать java: «Мне нужен T, который реализует TBase с типом T и T._Fields», чтобы я мог сделать val msg = MyContainer<MyEvent>()?


person imandrewd    schedule 16.08.2019    source источник


Ответы (1)


Если это только контейнер, вы можете использовать звездную проекцию:

class MyContainer<T: TBase<T,*>>

Это заставит val msg = MyContainer<MyEvent>() работать. Этот метод иногда полезен, когда вы все равно работаете с объектами, используя отражение, как в случае с Protobuf и Thrift.

Но ваш вопрос не дает подсказок о том, как вы планируете использовать этот контейнер.

person Alexey Soshin    schedule 16.08.2019
comment
Благодарю вас! Кажется, это работает (я новичок в Java/Kotlin). Итак, чтобы ответить на ваш вопрос, я использую набор сгенерированных классов, я хотел бы добавить к ним некоторые удобные методы для выполнения двоичной сериализации/десериализации. Я читал в другом месте, что рекомендуется не изменять автоматически сгенерированный код и вместо этого использовать класс-оболочку; так что это был мой (возможно, неэффективный) подход. Контейнер здесь просто добавляет некоторые дополнительные методы, которые будут работать с любым сгенерированным экономным классом. - person imandrewd; 17.08.2019
comment
Я сделал что-то очень похожее с Protobuf, и я бы порекомендовал вам создать эти классы-оболочки. Вы можете столкнуться с ограничениями, используя этот подход, основанный на дженериках. - person Alexey Soshin; 17.08.2019