Пользовательская логика для определенных ограниченных универсальных типов в Java

У меня есть следующая иерархическая структура для A, B и C:

interface A {

}

class B implements A {

}

class C implements A {

}

Я хочу разработать общий метод, который принимает Set любого подтипа A и выполняет некоторую пользовательскую логику, если подтип B или C.

У меня есть следующий блок кода для вышеупомянутой вещи:

public class Main {
    public static <T extends A> void method1(Set<T> items) {
        if (/* condition for instances of B */) {
            // some custom logic for type B
        } else if (/* condition for instances of C */) {
            // some custom logic for type C
        } else {
            throw new RuntimeException("Type not supported.");
        }
    }

    public static <T extends A> void method2(Set<T> items, Class<T> tClass) {
        if (tClass == B.class) {
            // some custom logic for B
        } else if (tClass == C.class) {
            // some custom logic for C
        } else {
            throw new RuntimeException("Type not supported.");
        }
    }
}

Я хочу смоделировать его так, как моделируется method1 (без передачи дополнительного Class<T> в списке параметров). method2 достигает этого, но путем передачи параметра Class<T>.

Каков элегантный способ добиться этого?

Я знаю о стирании типов в Java (поэтому тип T не будет доступен во время выполнения). Кроме того, я мог бы выделить общую функциональность самого интерфейса A и просто вызвать item.extractedMethod(), что позволило бы избежать блока if-else.

Поэтому я просто хотел проверить, есть ли какой-нибудь другой элегантный способ справиться с таким сценарием.


person Lavish Kothari    schedule 30.04.2021    source источник
comment
Более элегантный способ — не использовать дженерики. Если ваш метод работает только с конечным числом типов, он не должен быть универсальным.   -  person Sweeper    schedule 30.04.2021
comment
Элегантный способ - определить методы на интерфейсе, да, и не выполнять собственную диспетчеризацию через if else.   -  person JP Moresmau    schedule 30.04.2021