请注意,所有代码都是为了传达我的问题的核心思想而简化的示例。虽然需要进行轻微编辑,但应该可以编译和运行。
我有几个类都实现了一个共同的接口。
这些方法会定期进行调用,如下所示:
这个的例子输出如下:
看输出结果,很明显在调用doSomething(Inter in1, Inter in2)时,即使其他方法应该被调用。有趣的是,输出的类名是正确的。
为什么Java在运行时使用反射确定类类型时还具有静态方法重载呢? 有没有办法让Java做到这一点?我知道可以使用反射和Class.getMethod()以及method.invoke()来获得想要的结果,但使用强制转换会更加简洁。
我意识到之前已经问过类似概念的问题,但是虽然所有答案都很有启发性,但没有一个能让我满意。 双重分派看起来可以工作,但这意味着需要重新设计很多代码,因为我经常使用这种类型的东西。
我有几个类都实现了一个共同的接口。
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()来获得想要的结果,但使用强制转换会更加简洁。
我意识到之前已经问过类似概念的问题,但是虽然所有答案都很有启发性,但没有一个能让我满意。 双重分派看起来可以工作,但这意味着需要重新设计很多代码,因为我经常使用这种类型的东西。