Вот Java общая картина:Java общая функция: как вернуть Generic тип
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-ков, но фиктивный бизнес-поле уверен, выглядит некрасиво.
Обратите внимание, что такие функции не всегда вызывают newInstance
. Очевидно, что если они это сделают, им не нужно звонить resultClass.cast
.
За исключением того, что вы не можете получить и таким образом передать экземпляр класса для универсального класса, такого как «Map», поэтому это не поможет вообще с вопросом OP. –
ChssPly76
Yup. Именно так мы и пришли. – bmargulies
Они не поддерживаются на языке, но вы используете TypeLiteral, изобретенный Нилом Гафтером. http://gafter.blogspot.com/2006/12/type-literals.html –