如何在Java中特定地使用该泛型来特定化对泛型函数的调用?
发布时间:2020-12-15 04:15:53 所属栏目:Java 来源:网络整理
导读:我有一个基类,很少有派生的孩子,名为ChildN. 我也有一个Container类,具有ChildN特定的方法. 最后我有一个主类,我希望将所有Base-generic逻辑移动到helper方法中,但是在这个逻辑的中间某处我可能需要将一个ChildN特定的对象放入Container类的正确方法中.我怎
我有一个基类,很少有派生的孩子,名为ChildN.
我也有一个Container类,具有ChildN特定的方法. 最后我有一个主类,我希望将所有Base-generic逻辑移动到helper方法中,但是在这个逻辑的中间某处我可能需要将一个ChildN特定的对象放入Container类的正确方法中.我怎么做?如何使用正确的ChildN类型专门调用hassleSafeAdder,因此可以在此方法中访问它并且可以转换为它,或者做一些其他能够正确地将对象调度到正确方法的东西? // 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()); } } 期望的伪代码: hassleSafeAdder<Child1>(container,new Child1()); hassleSafeAdder<Child2>(container,new Child2()); hassleSafeAdder<Child3>(container,new Child3()); hassleSafeAdder<Child4>(container,new Child4()); 解决方法
您可以使用
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); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |