根据输入和返回动态值切换

时间:2013-01-22 11:18:54

标签: java oop generics generic-programming

在这个方法中我得到字符串作为输入,并根据字符串名称我需要返回值有时它的字符串有时int,double,int64,bool等 由于它的动态类型我不知道如何在方法返回类型中定义它 以及如何添加值以及如何调用此方法返回类型是动态的,任何想法?

public static ? SwitchInput(String TypeName) {

       if (TypeName == "java.lang.String" ) {
            Return = "A";
        }
        else if (TypeName == "int" ) {
            Return =  1;
        }
        else if (TypeName == "double") {
            Return = 1.00
        }
对于bool和所有其他类型的

    }

3 个答案:

答案 0 :(得分:2)

Object将是您最好的选择,除非返回的类型与Ancestor共享

示例:

public static Object switchInput(String typeName) {       

   if ("java.lang.String".equals(typeName)) {
        return "A";
    }
    else if ("int".equals(typeName)) {
        return 1i;
    }
    else if ("double".equals(typeName)) {
        return 1.0d
    }
 }

泛型的另一个例子

 static <T> T switchInput(String typeName){
   if ("java.lang.String".equals(typeName)) {
    return "A";
    }
    else if ("int".equals(typeName)) {
        return 1i;
    }
    else if ("double".equals(typeName)) {
        return 1.0d
    }

 }

 String str = MyClass.switchInput("java.lang.String")

我没有测试过,这是我对泛型的第一个想法的简单版本

答案 1 :(得分:1)

作为您问题的丑陋解决方案,您可以将方法设置为运行Object类型。 (如布尔值,整数,双精度都是子类型)

您必须确保在使用返回值(使用instanceof)之后推断出正确的类型,并将其重新转换为正确的类型。

我可以问你为什么需要这样的方法吗?这略微滥用了方法定义的概念。

  public static Object SwitchInput(String TypeName) {

   if (TypeName.equals("java.lang.String") ) {
        Return = new String("A");
    }
    else if (TypeName.equals("int") ) {
        Return =  new Integer(1);
    }
    else if (TypeName.equals("double")) {
        Return = new Double(1.00) ;
    }
 etc for bool and all the other types

}

使用此代码段来推断代码中的内容类型

  if(returned_value instanceof Double)

等。

答案 2 :(得分:1)

要知道返回类型是什么,你必须找到一个容纳所有这些类型的容器。显然,这是Object。您必须将基元类型转换为相应的对象(如int到Integer)。

更好的方法是创建一个新的容器类,它包含泛型类型&lt; T&gt;。像

public class SwitchDemo {

public static SwitchInputType<?> switchInput(String typeName) {
    if (typeName.equals("java.lang.String")) {
        return new SwitchInputType<String>(new String("A"));
    } else if (typeName.equals("int")) {
        return new SwitchInputType<Integer>(new Integer(312));
    }
    return null;
}

public static class SwitchInputType<T> {
    private T type;

    public SwitchInputType(T type) {
        super();
        this.type = type;
    }

    public T getType() {
        return type;
    }

    public void setType(T type) {
        this.type = type;
    }
}

public static void main(String[] args) {
    SwitchInputType<?> sit1 = SwitchDemo.switchInput("java.lang.String");
    System.out.println(sit1.getType());
    SwitchInputType<?> sit2 = SwitchDemo.switchInput("int");
    System.out.println(sit2.getType());
}

}