首页 / JAVA / Java中的反射转换和重载方法调度
Java中的反射转换和重载方法调度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中的反射转换和重载方法调度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2312字,纯文字阅读大概需要4分钟。
内容图文
![Java中的反射转换和重载方法调度](/upload/InfoBanner/zyjiaocheng/802/aa2deefd140441518c6678c1c7917756.jpg)
请注意,所有代码都是一个简化的示例,以便只传达我的问题的核心思想.经过轻微编辑后,它应该全部编译并运行.
我有几个类都实现了一个通用接口.
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()来获得我想要的结果,但是使用强制转换它会更加整洁.
我意识到之前已经提出过关于类似概念的问题,但是虽然所有答案都是提供信息的,但没有人满意我.
双重调度看起来会起作用,但这意味着要重新编写很多代码,因为我经常使用这种类型的东西.
解决方法:
在我看来,我们正在谈论正在发生的事情:
doSomething(in1.getClass().cast(in1), in2.getClass().cast(in2));
基于你的惊喜,输出的类型总是Inter,看起来你对这里发生的事情有点困惑.特别是,您似乎认为in1.getClass().cast(in1)和in2.getClass().cast(in2)应该强制执行不同的重载,因为它们的运行时类型不同.但是,这是错误的.
方法重载解析静态发生.这意味着它基于方法的两个参数的声明类型而发生.由于in1和in2都被声明为Inter,所选择的方法显然是无效的doSomething(Inter in1,Inter in2).
这里的内容是in1被宣布为国际米兰.这意味着为了静态分析,in1.getClass()与Inter.class基本相同 – getClass只返回一个Class<?延伸Inter>.因此,演员表是无用的,你只会得到第一次超载.
内容总结
以上是互联网集市为您收集整理的Java中的反射转换和重载方法调度全部内容,希望文章能够帮你解决Java中的反射转换和重载方法调度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。