I'm having the following hierarchical structure for A, B and C:
interface A {
}
class B implements A {
}
class C implements A {
}
I want to design a generic method that takes in Set of any subtype of A and perform some custom logic if the subtype is either B or C.
I've the following for code-block for the above mentioned thing:
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.");
}
}
}
I want to model it in the way how method1 is modelled (without passing an extra Class<T> in the parameter list). method2 achieves that but by passing a Class<T> parameter.
What is the elegant way to achieve this?
I'm aware of type-erasure in Java (and so type T will not be available at runtime). Also, I could have extracted out the common functionality in the interface A itself and simply call item.extractedMethod() which would have avoided the if-else block.
So I just wanted to check if there's any other elegant way of handling this type of scenario.