У меня есть следующая иерархическая структура для 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.
Поэтому я просто хотел проверить, есть ли какой-нибудь другой элегантный способ справиться с таким сценарием.