使用String和方法重载创建对象

时间:2012-05-02 10:37:49

标签: java reflection 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。我会感激任何想法。 感谢。

找到相关的帖子; Overloading in Java and multiple dispatch

4 个答案:

答案 0 :(得分:5)

这不仅仅是处理原始类型的问题。

编译时中决定调用哪个方法,也就是说,如果你想根据参数的类型调用不同的方法,你需要多次调用(即你需要if-construct)。

换句话说,即使doStuff2IntegerDouble作为参数(您的代码基本上和它一样好),它也不会起作用。

(简而言之,这是因为Java具有单一调度。要模拟多个调度,您需要使用条件语句或访问者模式。 )

答案 1 :(得分:1)

正如aioobe所说,重载方法之间的选择是在编译时基于参数的静态类型进行的。

如果要在运行时模拟过载选择,则需要对不同的可能方法进行一些复杂的运行时分析。它会是这样的:

  1. 获取声明为doStuff2的类的所有声明方法。
  2. 过滤掉名称不是doStuff2的方法。
  3. 过滤掉无法从参数值的(动态)类型赋值参数类型的方法。
  4. 其余的方法,选择最匹配的方法......注意处理“关系”不明确。
  5. 这对于编码来说会很棘手,如果你也处理原始类型,那就太棘手了。它还会使方法调用变得昂贵。


    坦率地说,某种硬连线调度要简单得多。如果您不喜欢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);
    

    ...至少允许您动态“插入”对新类型的支持。

答案 2 :(得分:1)

由于方法调用是在编译时决定的,因为另一个答案告诉你,重载不适合你。我认为这个问题可以通过继承来解决。因此,您使用yourMethod()编写基类并在派生类中覆盖它。

答案 3 :(得分:1)

如果你采用反射,你只需要专门处理原始类型。所以你的技术可以工作,但增加了一些明确的测试。如果您需要反思地找到接受原始double的方法,请使用double.class