我想编写一个可以接受类型参数的方法(或者任何方法可以从中找出类型)并返回此类型的值,这样我就不必转换返回类型。
这是一种方法:
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。
如何编写此方法来接受类型参数,并返回此类型?
答案 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);
}
}