请注意,所有代码都是一个简化示例,目的是仅传达我的问题的核心思想。它应该都经过轻微的编辑后编译并运行。使用Java进行反射投射和重载方法调度
我有几个类都实现了一个通用接口。
public interface Inter{}
public class Inter1 implements Inter{}
public class Inter2 implements Inter{}
在一个单独的I类有类型间,我使用来存储和移除Inter1和Inter2类型,基于用户输入的列表。
java.util.ArrayList<Inter> inters = new java.util.ArrayList<Inter>();
我也有一个重载方法家族,它处理每个实现如何相互作用,以及2个“Inter”的默认实现。
void doSomething(Inter in1, Inter in2){
System.out.println("Inter/Inter");
}
void doSomething(Inter1 in1, Inter1 in2){
System.out.println("Inter1/Inter11");
}
void doSomething(Inter2 in1, Inter1 in2){
System.out.println("Inter2/Inter1");
}
的方法是周期性地调用像这样:
for(int i = 0; i < inters.size() - 1; i++){
for(int o = i+1; o < inters.size(); o++){
Inter in1 = inters.get(i); Inter in2 = inters.get(o);
doSomething(in1.getClass().cast(in1), in2.getClass().cast(in2));
System.out.println("Class 1: " + in1.getClass().getName());
System.out.println("Class 2: " + in2.getClass().getName());
}
}
从该输出的一个例子是:
Inter/Inter
Class 1: Inter
Class 2: Inter
Inter/Inter
Class 1: Inter
Class 2: Inter1
Inter/Inter
Class 1: Inter1
Class 2: Inter1
综观输出,很显然,doSomething的(国际IN1, Inter in2)被调用,即使在应该调用其他方法的情况下也是如此。有趣的是,输出的类名是正确的。
为什么java在运行时使用反射来确定类类型时有静态方法重载? 有什么办法让Java来做到这一点?我知道我可以使用反射和Class.getMethod()和method.invoke()来获得我想要的结果,但是在使用cast的时候会更加简单。
我意识到之前已经提出过有关类似概念的问题,但所有的答案都是信息性的,没有人满意我。 Double dispatch看起来好像会起作用,但这意味着需要重新编写大量的代码,因为我经常使用这种类型的东西。
谢谢,我希望不是这样,因为它相当烦人。我只是不禁觉得像这样的东西应该是动态的。它使一切变得更加复杂......噢,我想我只需要使用反射API,就像看起来那样混乱。 – Adno 2012-03-28 06:48:20