Как избежать кастинга при наследовании Джексона - PullRequest
1 голос
/ 16 апреля 2020

сценарий использования : для класса конфигурации мне нужно использовать класс переводчика.

У меня есть 3 класса конфигурации (A, B, C) и 3 класса переводчика. (X, Y, Z).

A - родительский конфигурационный класс, а (B, C) - подклассы. Точно так же X - это родительский класс транслятора, а (Y, Z) - подклассы.

Переводчик Y переводит B, а Переводчик Z переводит C ie (B -> Y, C -> Z) * ​​1009 *

СЕЙЧАС, я получаю строковый ввод (для класса конфигурации) и использую Джексон для десериализации его в тип класса конфигурации А. С Джексоном я упомянул подтипы, и Джексон может десериализовать его в требуемые подтипы В или C правильно.

A a = new ObjectMapper().readValue(inputString, A.class)

Теперь я хочу сделать что-то вроде:

if(a.type == 'B') Y.process((B)a) // Since translator Y was for B subClass
if(a.type == 'C') Z.process((C)c)//  Since translator Z was for C subClass

есть ли способ, я могу избежать здесь приведения типов.

1 Ответ

0 голосов
/ 16 апреля 2020

Полагаю, вы определили process() следующим образом:

public class Y
{
    public void process( B b ) {…}
}

Вы можете добавить

…
public void process( A b ) { process( (B) b ); }
…

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

Из вашего описания, нет способа избежать броска; вам это нужно, так или иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...