Универсальная функция 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.

Ответы на вопрос(6)

Ваш ответ на вопрос