Ale*_*min 3 java generics syntax polymorphism
我有一个Base班级,很少有派生的孩子,名字ChildN.
我也有一个Container类,有ChildN特定的方法.
最后我有一个主类,我希望将所有Base通用逻辑转换为辅助方法,但在这个逻辑的中间某处我可能需要将一个ChildN特定的对象放入正确的Container类方法中.我怎么做?如何hassleSafeAdder使用正确的ChildN类型专门调用,所以它可以在这个方法中访问,我可以转换它,或做一些其他的事情,使得能够正确地将对象调度到正确的方法?
// base class
public static class Base { }
// derived classes
public static class Child1 extends Base { }
public static class Child2 extends Base { }
public static class Child3 extends Base { }
public static class Child4 extends Base { }
// class with derived types in method signature
public static class Container {
public void add(Child1 obj) { }
public void add(Child2 obj) { }
public void add(Child3 obj) { }
public void add(Child4 obj) { }
}
// main class where execution happens
public static class Main {
private static <T extends Base> void hassleSafeAdder(Container container, T value) {
// do some hassle
container.add(value); // error, because T could be any Base derivation, while container has only ChildN-specific ones.
// cleanup hassle resources
}
public static void main(String[] args) {
Container container = new Container();
// how to parametrize this calls so they will be valid?
hassleSafeAdder(container, new Child1());
hassleSafeAdder(container, new Child2());
hassleSafeAdder(container, new Child3());
hassleSafeAdder(container, new Child4());
}
}
Run Code Online (Sandbox Code Playgroud)
期望的伪代码:
hassleSafeAdder<Child1>(container, new Child1());
hassleSafeAdder<Child2>(container, new Child2());
hassleSafeAdder<Child3>(container, new Child3());
hassleSafeAdder<Child4>(container, new Child4());
Run Code Online (Sandbox Code Playgroud)
您可以使用Double Dispatch模式.
class Ideone
{
private static <T extends Base> void hassleSafeAdder(Container container, T value) {
value.addToContainer(container);
}
public static void main (String[] args) throws java.lang.Exception {
Container container = new Container();
hassleSafeAdder(container, new Child1());
hassleSafeAdder(container, new Child2());
hassleSafeAdder(container, new Child3());
hassleSafeAdder(container, new Child4());
}
public static class Container {
public void add(Child1 obj) { }
public void add(Child2 obj) { }
public void add(Child3 obj) { }
public void add(Child4 obj) { }
}
public static abstract class Base {
public abstract void addToContainer(Container container);
}
public static class Child1 extends Base {
public void addToContainer(Container container) {
container.add(this);
}
}
public static class Child2 extends Base {
public void addToContainer(Container container) {
container.add(this);
}
}
public static class Child3 extends Base {
public void addToContainer(Container container) {
container.add(this);
}
}
public static class Child4 extends Base {
public void addToContainer(Container container) {
container.add(this);
}
}
}
Run Code Online (Sandbox Code Playgroud)