2012-03-30 12 views
8

¿Existe una manera directa de implementar un método con la siguiente firma? Como mínimo, la implementación necesitaría manejar tipos primitivos (por ejemplo, doble e entero). Los tipos no primitivos serían una buena ventaja.cadena genérica de java a <T> analizador

//Attempt to instantiate an object of type T from the given input string 
//Return a default value if parsing fails 
static <T> T fromString(String input, T defaultValue) 

implementación sería trivial para los objetos que implementan una interfaz fromstring (o equivalente), pero no he encontrado nada parecido. Tampoco he encontrado una implementación funcional que use la reflexión.

+0

Por qué estás tratando de volver ' t' en lugar de simplemente' t'? – Makoto

+0

@Makoto Este es un método genérico. '' declara una variable de tipo para el método. El tipo de devolución se declara simplemente como 'T'. – erickson

+0

Bastante justo. Ahora lo entiendo, gracias. – Makoto

Respuesta

5

Esto solo es posible si proporciona Class<T> como otro argumento. El T no contiene ninguna información sobre el tipo de devolución deseado.

static <T> T fromString(String input, Class<T> type, T defaultValue) 

A continuación, se puede averiguar el tipo de type. Un ejemplo concreto se puede encontrar en this blog article.

+2

Sí, se necesitaría el tipo, a menos que la API requiera que 'defaultValue' no sea nulo. –

+0

@DilumRanatunga ¿Puedes elaborar? Puedo ver cómo pasar un valor nulo haría imposible la inferencia de tipo, pero no veo cómo resolvería el problema de determinar el tipo concreto de T. – cqcallaw

+1

Use 'defaultValue.getClass()' para obtener el tipo ' Clase '. – BalusC

1

Usted quiere un objeto que analiza un tipo particular de una manera particular. Obviamente, no es posible determinar cómo analizar un tipo arbitrario simplemente del tipo. Además, es probable que desee cierto control sobre cómo se realiza el análisis sintáctico. Son las comas en números bien, por ejemplo. ¿Debería recortarse el espacio en blanco?

interface Parser<T> { 
    T fromString(String str, T dftl); 
} 

tipos método abstracto individual es de esperar deberían ser menos detallado para implementar en Java SE 8.

+0

Afortunadamente, el control preciso de los mecanismos de análisis no es necesario para mis propósitos. Es suficiente volver a un valor predeterminado si falla el análisis. – cqcallaw

0

Tal vez no responder a la pregunta de cómo implementar la solución, pero no es una biblioteca que hace precisamente esto (es decir, tiene casi una API idéntica según lo solicitado). Se llama type-parser y se podría utilizar algo como esto:

TypeParser parser = TypeParser.newBuilder().build(); 

Integer i = parser.parse("1", Integer.class); 
int i2 = parser.parse("42", int.class); 
File f = parser.parse("/some/path", File.class); 

Set<Integer> setOfInts = parser.parse("1,2,3,4", new GenericType<Set<Integer>>() {}); 
List<Boolean> listOfBooleans = parser.parse("true, false", new GenericType<List<Boolean>>() {}); 
float[] arrayOfFloat = parser.parse("1.3, .4, 3.56", float[].class);