Java泛型返回类型

Col*_*y77 39 java generics

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

这是一个方法:

public Object doIt(Object param){
    if(param instanceof String){
        return "string";
    }else if(param instanceof Integer){
        return 1;
    }else{
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jac*_*ack 78

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

public <T> T mymethod(T type)
{
  return type;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

int i = my(23);
String s = my("lol");
Run Code Online (Sandbox Code Playgroud)


duf*_*ymo 11

从这开始:

public interface Command<T>
{
    T execute(T parameter);
}
Run Code Online (Sandbox Code Playgroud)


Pow*_*ord 8

简短的回答是不.一旦instanceof涉及,泛型通常是错误的答案.改为使用重载方法:

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

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

public Object doIt(Object param){
    return null;
}
Run Code Online (Sandbox Code Playgroud)

  • 6年后......说过,如果声明的类型是`Object`,这将不起作用,因为方法重载是在编译时基于声明的变量类型完成的. (2认同)