Универсальная функция Java: как вернуть универсальный тип
Вот общий шаблон 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
.