Java通用返回types
我想写一个方法,可以接受一个types参数(或任何方法可以找出types),并返回一个这种types的值,所以我不必强制返回types。
这里是一个方法:
public Object doIt(Object param){ if(param instanceof String){ return "string"; }else if(param instanceof Integer){ return 1; }else{ return null; } }
当我调用这个方法,并传入一个string,即使我知道返回types将是一个string,我必须投入返回对象。 这与int参数类似。
我该如何写这个方法来接受一个types参数,并返回这个types?
如果你不想有一个特定的接口来处理这些东西,你可以用这种方式使用一个通用的方法:
public <T> T mymethod(T type) { return type; }
请注意,通过这种方式,编译器不知道您计划在该方法中使用的types,因此您应该使用绑定types,例如:
public <T extends YourType> T mymethod(T type) { // now you can use YourType methods return type; }
但是你应该确定你需要一个通用的方法,这意味着doIt
的实现对于你打算使用的所有types都是一样的。 否则,如果每个实现不同,只是重载方法,它将工作正常,因为返回types不用于dynamic绑定:
public String my(String s) { return s; } public int my(int s) { return s; } int i = my(23); String s = my("lol");
从这开始:
public interface Command<T> { T execute(T parameter); }
简短的答案是不。 一旦涉及instanceof
,generics通常是错误的答案。 改用重载的方法:
public String doIt(String param){ return "string"; } public Integer doIt(Integer param){ return 1; } public Object doIt(Object param){ return null; }
我会敦促你不要使用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); } }