我有一个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。我会感激任何想法。 感谢。
答案 0 :(得分:5)
这不仅仅是处理原始类型的问题。
在编译时中决定调用哪个方法,也就是说,如果你想根据参数的类型调用不同的方法,你需要多次调用(即你需要if-construct)。
换句话说,即使doStuff2
将Integer
和Double
作为参数(您的代码基本上和它一样好),它也不会起作用。
(简而言之,这是因为Java具有单一调度。要模拟多个调度,您需要使用条件语句或访问者模式。 )
答案 1 :(得分:1)
正如aioobe所说,重载方法之间的选择是在编译时基于参数的静态类型进行的。
如果要在运行时模拟过载选择,则需要对不同的可能方法进行一些复杂的运行时分析。它会是这样的:
doStuff2
的类的所有声明方法。doStuff2
的方法。这对于编码来说会很棘手,如果你也处理原始类型,那就太棘手了。它还会使方法调用变得昂贵。
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);
...至少允许您动态“插入”对新类型的支持。
答案 2 :(得分:1)
由于方法调用是在编译时决定的,因为另一个答案告诉你,重载不适合你。我认为这个问题可以通过继承来解决。因此,您使用yourMethod()
编写基类并在派生类中覆盖它。
答案 3 :(得分:1)
如果你采用反射,你只需要专门处理原始类型。所以你的技术可以工作,但增加了一些明确的测试。如果您需要反思地找到接受原始double
的方法,请使用double.class
。