繁体   English   中英

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

[英]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)。

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

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

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

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

  1. 获取声明为doStuff2的类的所有声明方法。
  2. 过滤掉名称不是doStuff2的方法。
  3. 过滤掉其参数类型无法从参数值的(动态)类型赋值的方法。
  4. 在剩下的方法中,选择一个最匹配的方法......注意处理“关系”是不明确的。

编写代码会很棘手,如果你也处理原始类型,那就太棘手了。 它还会使方法调用变得昂贵。


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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM