Подтвердить что ты не робот

Тип возвращаемого типа Java

Я хотел бы написать метод, который может принять параметр типа (или какой бы метод он ни выбрал) и вернуть значение этого типа, поэтому мне не нужно указывать тип возвращаемого значения.

Вот способ:

public Object doIt(Object param){
    if(param instanceof String){
        return "string";
    }else if(param instanceof Integer){
        return 1;
    }else{
        return null;
    }
}

Когда я вызываю этот метод и передаю ему строку, даже если я знаю, что тип возвращаемого значения будет строкой, я должен применить возвращаемый объект. Это похоже на int param.

Как мне написать этот метод, чтобы принять параметр типа и вернуть этот тип?

4b9b3361

Ответ 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);
    }
}