Как вызываемый универсальный метод может знать тип универсального возврата? - PullRequest
0 голосов
/ 17 марта 2010

Я не смог найти дубликат этого вопроса для Java, хотя их много для C #.

У меня есть этот метод:

public <T> T getSomething() {
 //
}

В зависимости от типа T, у меня будет другой возврат. Например:

String a = getSomething();
int b = getSomething();

Для a мой метод вернет определенный String. Для b он вернет определенный int. И так далее.

Похоже, это можно сделать с помощью typeof() в C #. Как я могу достичь этого в Java?

Ответы [ 3 ]

1 голос
/ 17 марта 2010

К сожалению, это невозможно с Java, потому что он использует технику, называемую «стирание типа», чтобы дать возможность генерикам работать без изменения JVM. В результате, когда метод вызывается, все, что он знает, это Objects, поэтому он никогда не может узнать, какой тип он должен вернуть.

0 голосов
/ 18 марта 2010

В Java было бы более нормально написать что-то вроде:

public <T> List<T> getSomeThings() {
    //
}

Это прекрасно работает.

Возможно, прямой эквивалент того, что вы видели в C #, будет выглядеть примерно так:

public <T> T getSomething(Class<? extends T> clazz) {
    //
}

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

public <T> T getSomething(FactoryThing<? extends T> factory) {
    //
}

В некоторых случаях полезно выводить тип возвращаемого значения. Например, при чтении из потока сериализации Java, в котором из-за разработки API версии до 1.5 неконтролируемые предупреждения о преобразованиях невозможно избежать. Я предлагаю придерживаться этого с помощью метода private-package.

0 голосов
/ 17 марта 2010

Ваш пример не работает, если у вас нет кода внутри метода getSomething. Если я напишу

public <T> T getSomething(){ return null;}

это компилируется, но это бессмысленно. Тем не менее, вы обычно получаете свой T из контекста:

public class Foo<T>{ 
  public T getSomething()... 
}
new Foo<String>().getSomething()...

Предположительно, в вашей реализации должно быть что-то, что понимает тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...