2012-03-30 8 views
8

C'è un modo straight-forward per implementare un metodo con la seguente firma? Come minimo, l'implementazione dovrebbe gestire tipi primitivi (ad esempio Double e Integer). I tipi non primitivi sarebbero un bel bonus.java String generico per <T> parser

//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) 

Attuazione sarebbe banale per gli oggetti che hanno implementato un'interfaccia fromstring (o equivalente), ma non ho trovato una cosa del genere. Inoltre, non ho trovato un'implementazione funzionale che utilizza la riflessione.

+0

perché stai cercando di restituire ' T' invece di' T'? – Makoto

+0

@Makoto Questo è un metodo generico. '' dichiara una variabile di tipo per il metodo. Il tipo di ritorno è dichiarato semplicemente come 'T'. – erickson

+0

Abbastanza giusto. Ora capisco, grazie. – Makoto

risposta

5

Questo è possibile solo se si fornisce Class<T> come un altro argomento. Lo stesso T non contiene alcuna informazione sul tipo di reso desiderato.

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

Quindi si può capire il tipo da type. Un esempio concreto può essere trovato in this blog article.

+2

Sì, il tipo sarebbe necessario, a meno che l'API non richieda che "defaultValue" non sia nullo. –

+0

@DilumRanatunga Puoi elaborare? Posso vedere come passare un valore nullo renderebbe impossibile l'inferenza di tipo, ma non vedo come risolverebbe il problema di determinare il tipo concreto di T. – cqcallaw

+1

Utilizzare 'defaultValue.getClass()' per ottenere il tipo come ' Classe '. – BalusC

1

Si desidera un oggetto che analizzi un particolare tipo in un modo particolare. Ovviamente non è possibile determinare come analizzare un tipo arbitrario solo dal tipo. Inoltre, probabilmente vuoi avere il controllo su come è fatto l'analisi. Ad esempio, le virgole sono a posto. Gli spazi bianchi dovrebbero essere tagliati?

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

tipi Singolo Estratto metodo dovrebbe auspicabilmente essere meno verboso da implementare in Java SE 8.

+0

Fortunatamente, il controllo preciso sui meccanismi di parsing non è necessario per i miei scopi. È sufficiente tornare a un valore predefinito se l'analisi fallisce. – cqcallaw

0

Forse non rispondendo alla domanda come implementare la soluzione, ma v'è una biblioteca che fa proprio questo (cioè ha quasi un'API identica come richiesto). Si chiama type-parser e potrebbe essere utilizzato o meno così:

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);