Вот общий шаблон 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);
Теперь мы снова находимся в необходимости приведения и подавления предупреждения.
Я полагаю, что можно взять что-то из семейства java.lang.reflect.Type
вместо Class
, но это не особенно легко придумать. Это выглядит так:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
Учитывая это, вызываемая функция может извлекать базовый тип и использовать его для приведения типов или newInstance-ing, но бизнес с фиктивными полями наверняка выглядит некрасиво.
Обратите внимание, что подобные функции не всегда вызывают newInstance
. Очевидно, что если они это сделают, им не нужно звонить resultClass.cast
.