Я хотел бы записать метод, который может принять параметрический усилитель типа (или независимо от того, что метод может выяснить тип от), и возвратите значение этого типа, таким образом, я не должен бросать тип возврата.
Вот метод:
public Object doIt(Object param){
if(param instanceof String){
return "string";
}else if(param instanceof Integer){
return 1;
}else{
return null;
}
}
Когда я назову этот метод и передачу в нем Строка, даже если я буду знать, то типом возврата будет Строка, я должен бросить эхо-сигнал. Это подобно международному параметрическому усилителю.
Как я запишу этот метод, чтобы принять параметрический усилитель типа и возвратить этот тип?
если вы не хотите иметь определенный интерфейс для обработки этих вещей, вы можете использовать общий метод следующим образом:
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");
Короткий ответ - не надо. Как только включается instanceof
, универсальные шаблоны обычно являются неправильным ответом. Вместо этого используйте перегруженные методы:
public String doIt(String param){
return "string";
}
public Integer doIt(Integer param){
return 1;
}
public Object doIt(Object param){
return null;
}
Начните с этого:
public interface Command<T>
{
T execute(T parameter);
}
Я призываю вас НЕ использовать 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);
}
}