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