Java универсальный тип возврата

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

Вот метод:

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

Когда я назову этот метод и передачу в нем Строка, даже если я буду знать, то типом возврата будет Строка, я должен бросить эхо-сигнал. Это подобно международному параметрическому усилителю.

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

39
задан Jordan S. Jones 19 April 2010 в 17:06
поделиться

4 ответа

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

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");
78
ответ дан 27 November 2019 в 02:17
поделиться

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

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

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

public Object doIt(Object param){
    return null;
}
8
ответ дан 27 November 2019 в 02:17
поделиться

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

public interface Command<T>
{
    T execute(T parameter);
}
11
ответ дан 27 November 2019 в 02:17
поделиться

Я призываю вас НЕ использовать 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);
    }
}
0
ответ дан 27 November 2019 в 02:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: