Привет, не могу избавится от явного приведения типа в следующем примере, хотя думаю, что в данном случае это возможно:
Код | public class GerericTest { public static void main(String[] args) throws Exception { new GerericTest().test(); } public void test() throws Exception { ClassInterfaceA genericA = (ClassInterfaceA) init(EnumA.TEST); // TODO: remove cast ClassInterfaceB genericB = (ClassInterfaceB) init(EnumB.TEST); // TODO: remove cast genericA.sayHelloA(); genericB.sayHelloB(); } private <T extends EnumInterface<? extends ClassInterface>> ClassInterface init(T value) throws Exception { return value.getClassInterface().newInstance(); } }
|
Код | public interface ClassInterface {
}
|
Код | public interface ClassInterfaceA extends ClassInterface { public void sayHelloA(); }
|
Код | public interface ClassInterfaceB extends ClassInterface { public void sayHelloB(); }
|
Код | public class ClassA implements ClassInterfaceA { @Override public void sayHelloA() { System.out.println("Hello: " + this.getClass().getName()); } }
|
Код | public class ClassB implements ClassInterfaceB { @Override public void sayHelloB() { System.out.println("Hello: " + this.getClass().getName()); } }
|
Код | public interface EnumInterface<T extends ClassInterface> { public Class<? extends ClassInterface> getClassInterface(); }
|
Код | public enum EnumA implements EnumInterface<ClassInterfaceA> { TEST(ClassA.class); private Class<? extends ClassInterfaceA> clazz;
private EnumA(Class<? extends ClassInterfaceA> clazz) { this.clazz = clazz; } @Override public Class<? extends ClassInterfaceA> getClassInterface() { return clazz; } }
|
Код | public enum EnumB implements EnumInterface<ClassInterfaceB> { TEST(ClassB.class); private Class<? extends ClassInterfaceB> clazz; private EnumB(Class<? extends ClassInterfaceB> clazz) { this.clazz = clazz; }
@Override public Class<? extends ClassInterfaceB> getClassInterface() { return clazz; } }
|
Поскольку EnumA и EnumB имеют поля с конкретными интерфейсами ClassInterfaceA и ClassInterfaceB, а не общий интерфейс ClassInterface, то думаю, что можно изменить данный пример так, чтобы он возвращал то, что надо без использования каста...
Кто знает как сделать ? |