Aquí hay un patrón genérico de Java:Java: cómo devolver el tipo genérico
public <T> T getResultData(Class<T> resultClass, other_args) {
...
return resultClass.cast(T-thing);
}
Una llamada típica se parece a:
DoubleBuffer buffer;
buffer = thing.getResultData(DoubleBuffer.class, args);
nunca he sido capaz de averiguar cómo utilizar este patrón está limpio cuando el tipo de devolución deseado es, en sí mismo, genérico. Para ser 'concreto', ¿qué ocurre si una función como esta quiere devolver Map<String,String>
? Dado que no puede obtener un objeto de clase para un genérico, por supuesto, la única opción sería pasar Map.class
, y luego necesita un yeso y un @SuppressWarning
después de todo.
Uno termina con una llamada como:
Map<String, String> returnedMap;
returnedMap = thing.getResultData(Map.class, some_other_args);
Ahora se trata de volver a la necesidad de moldes y la supresión de una advertencia.
Supongo que se podría tomar algo de la familia java.lang.reflect.Type
en lugar del Class
, pero no son especialmente fáciles de confeccionar. Que se parece a:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
Ante esto, la función llamada podría extraer el tipo base y el uso que para la fundición o newInstance-ción, pero el negocio campo ficticio seguro que se ve feo.
Tenga en cuenta que funciones como esta no siempre llaman al newInstance
. Obviamente, si lo hacen, no necesitan llamar al resultClass.cast
.
Excepto que no puede obtener y, por lo tanto, pasar la instancia de clase para la clase genérica como 'Map', así que esto no ayudará en absoluto con la pregunta de OP. –
ChssPly76
Sí. Así es exactamente como llegamos aquí. – bmargulies
No son compatibles con el lenguaje pero utiliza TypeLiteral, inventado por Neal Gafter. http://gafter.blogspot.com/2006/12/type-literals.html –