Универсальный тип возврата Java - PullRequest
39 голосов
/ 19 апреля 2010

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

Вот метод:

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.

Как мне написать этот метод для принятия типа param и возврата этого типа?

Ответы [ 4 ]

77 голосов
/ 19 апреля 2010

если вы не хотите иметь определенный интерфейс для обработки этих вещей, вы можете использовать универсальный метод следующим образом:

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");
11 голосов
/ 19 апреля 2010

Начните с этого:

public interface Command<T>
{
    T execute(T parameter);
}
8 голосов
/ 19 апреля 2010

Короткий ответ - нет. Как только instanceof принимает участие, Дженерики обычно являются неправильным ответом. Вместо этого используйте перегруженные методы:

public String doIt(String param){
    return "string";
}

public Integer doIt(Integer param){
    return 1;
}

public Object doIt(Object param){
    return null;
}
0 голосов
/ 19 апреля 2010

Я бы призвал вас НЕ использовать 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...