В 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.