Java泛型返回类型

时间:2010-04-19 17:01:45

标签: java generics

我想编写一个可以接受类型参数的方法(或者任何方法可以从中找出类型)并返回此类型的值,这样我就不必转换返回类型。

这是一种方法:

public Object doIt(Object param){
    if(param instanceof String){
        return "string";
    }else if(param instanceof Integer){
        return 1;
    }else{
        return null;
    }
}

当我调用此方法并传入一个String时,即使我知道返回类型将是一个String,我必须强制转换返回Object。这类似于int param。

如何编写此方法来接受类型参数,并返回此类型?

4 个答案:

答案 0 :(得分:77)

如果你不想拥有一个特定的接口来处理那些东西,你可以用这种方式使用泛型方法:

public <T> T mymethod(T type)
{
  return type;
}

请注意,编译器不会知道您计划在该方法中使用的类型,因此您应该使用绑定类型,例如:

public <T extends YourType> T mymethod(T type)
{
  // now you can use YourType methods
  return type;
}

但是您应该确定需要一个通用方法,这意味着doIt的实现对于您计划使用它的所有类型都是相同的。否则,如果每个实现都不同只是重载方法,它将正常工作,因为返回类型不用于动态绑定:

public String my(String s)
{
  return s;
}

public int my(int s)
{
  return s;
}

int i = my(23);
String s = my("lol");

答案 1 :(得分:11)

从这开始:

public interface Command<T>
{
    T execute(T parameter);
}

答案 2 :(得分:8)

简短的回答是不要。一旦instanceof介入,泛型通常是错误的答案。请改用重载方法:

public String doIt(String param){
    return "string";
}

public Integer doIt(Integer param){
    return 1;
}

public Object doIt(Object param){
    return null;
}

答案 3 :(得分:0)

我会建议 使用instanceof,但是这段代码可以满足您的需求:

public class Main
{
    public static void main(String[] args) 
    {
        final Main main;
        final String strVal;
        final Integer intVal;
        final Float   floatVal;

        main     = new Main();
        strVal   = main.doIt("Hello");
        intVal   = main.doIt(5);
        floatVal = main.doIt(5.0f);

        System.out.println(strVal);
        System.out.println(intVal);
        System.out.println(floatVal);
    }

    public <T> T doIt(final T thing)
    {
        T t;

        if(thing instanceof String)
        {
            t = (T)"String";
        }
        else if (thing instanceof Integer)
        {
            t = (T)Integer.valueOf(1);
        }
        else
        {
            t = null;
        }

        return (t);
    }
}