【发布时间】:2012-03-28 03:08:58
【问题描述】:
请注意,所有代码都是一个简化示例,以便仅传达我的问题的核心思想。稍作编辑后,它应该全部编译并运行。
我有几个类都实现了一个通用接口。
public interface Inter{}
public class Inter1 implements Inter{}
public class Inter2 implements Inter{}
在一个单独的类中,我有一个 Inter 类型列表,用于根据用户输入存储和删除 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(Inter in1, Inter in2),即使在应该调用其他方法的情况下也是如此。有趣的是,输出的类名是正确的。
当类类型在运行时使用反射确定时,为什么java会有静态方法重载? 有没有办法让Java做到这一点?我知道我可以使用反射和 Class.getMethod() 和 method.invoke() 来获得我想要的结果,但是使用强制转换会更简洁。
我意识到以前有人问过有关类似概念的问题,但是虽然所有答案都提供了丰富的信息,但没有一个让我满意。 双重调度看起来可行,但这意味着要重新编写大量代码,因为我经常使用这种类型的东西。
【问题讨论】:
标签: java reflection overloading