![](/img/trans.png)
[英]How to create class object from class name and and use it for method overloading
[英]Create an object with a String and method overloading
我有一个String,可以是Double或Integer类型或其他类型。 我首先需要创建一个Double或Integer对象,然后将其发送到重载方法。 到目前为止,这是我的代码;
public void doStuff1(object obj, String dataType){
if ("Double".equalsIgnoreCase(dataType)) {
doStuff2(Double.valueOf(obj.toString()));
} else if ("Integer".equalsIgnoreCase(dataType)) {
doStuff2(Integer.valueOf(obj.toString()));
}
}
public void doStuff2(double d1){
//do some double related stuff here
}
public void doStuff2(int d1){
//do some int related stuff here
}
我想在没有if / else的情况下这样做,就像这样;
Class<?> theClass = Class.forName(dataType);
问题是'theClass'仍然无法转换为double或int。 我会感激任何想法。 谢谢。
找到一个相关的线程; 在Java中重载和多次调度
这不仅仅是处理原始类型的问题。
在编译时决定调用哪个方法,也就是说,如果您希望能够根据参数的类型调用不同的方法,则需要多次调用(即需要if-construct)。
换句话说,即使doStuff2
将Integer
和Double
作为参数(它的代码基本上和它一样好),它也不会起作用。
(简而言之,这是因为Java具有单一调度 。要模拟多个调度,您需要使用条件语句或访问者模式。)
正如aioobe所说,重载方法之间的选择是在编译时根据参数的静态类型进行的。
如果要在运行时模拟过载选择,则需要对不同的可能方法进行一些复杂的运行时分析。 它会是这样的:
doStuff2
的类的所有声明方法。 doStuff2
的方法。 编写代码会很棘手,如果你也处理原始类型,那就太棘手了。 它还会使方法调用变得昂贵。
坦率地说,某种硬连线调度要简单得多。 如果您不喜欢if / else tests(或在Java 7中打开String),那么您可以执行类似这样的操作。
Map<String, Operation> map = ...
map.put("Double", new Operation(){
public void doIt(Object obj) {
doStuff2((Double) obj);
}});
map.put("Integer", new Operation(){
public void doIt(Object obj) {
doStuff2((Integer) obj);
}});
...
map.get(typeName).doIt(obj);
...至少允许您动态“插入”对新类型的支持。
由于方法调用是在编译时决定的,因为另一个答案告诉你,重载对你不起作用。 我认为这个问题可以通过继承来解决。 因此,您使用yourMethod()
编写基类并在派生类中覆盖它。
如果你采用反射,你只需要专门处理原始类型。 所以你的技术可以工作,但增加了一些明确的测试。 如果您需要反射性地找到接受基本double
的方法,请使用double.class
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.