Здесь общий шаблон Java:
public <T> T getResultData(Class<T> resultClass, other_args) {
...
return resultClass.cast(T-thing);
}
Типичный вызов выглядит следующим образом:
DoubleBuffer buffer;
buffer = thing.getResultData(DoubleBuffer.class, args);
Я никогда не мог понять, как использовать этот шаблон, когда желаемый тип возвращаемого значения сам по себе является общим. Чтобы быть "конкретным", что, если такая функция хочет вернуть Map<String,String>
? Так как вы не можете получить объект класса для общего, конечно, единственным вариантом будет передать Map.class
, а затем вам понадобится листинг и @SuppressWarning
.
В конце появляется вызов типа:
Map<String, String> returnedMap;
returnedMap = thing.getResultData(Map.class, some_other_args);
Теперь один возвращается к необходимости приведения и пресечения предупреждения.
Я полагаю, что вместо Class
можно взять что-то из семейства java.lang.reflect.Type
, но это не особенно легко придумать. Это выглядит так:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
Учитывая это, вызываемая функция может извлечь базовый тип и использовать это для кастинга или newInstance-ing, но фиктивный бизнес на поле выглядит безобразным.
Обратите внимание, что такие функции не всегда вызывают newInstance
. Очевидно, что если это так, им не нужно называть resultClass.cast
.