2012-03-30 20 views
8

Czy istnieje prosty sposób wdrożenia metody z następującym podpisem? Minimalna implementacja będzie wymagała obsługi typów pierwotnych (na przykład Double i Integer). Nietypowe typy byłyby miłym dodatkiem.java generic String na <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) 

Realizacja byłoby trywialne do obiektów realizowanych interfejs FromString (lub równoważny), ale nie znalazłem czegoś takiego. Nie znalazłem także funkcjonalnej implementacji, która używa refleksji.

+0

Dlaczego starasz się wrócić ' T' zamiast po prostu' T'? – Makoto

+0

@Makoto Jest to ogólna metoda. '' deklaruje zmienną typu dla metody. Typ zwracany jest deklarowany po prostu jako 'T'. – erickson

+0

Wystarczająco fair. Teraz rozumiem, dzięki. – Makoto

Odpowiedz

5

Jest to możliwe tylko wtedy, gdy podasz Class<T> jako inny argument. Samo urządzenie T nie zawiera żadnych informacji na temat pożądanego typu zwrotu.

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

Następnie można określić typ przez type. Konkretny przykład można znaleźć w this blog article.

+2

Tak, typ będzie potrzebny, chyba że interfejs API wymaga, aby parametr 'defaultValue' miał wartość inną niż null. –

+0

@DilumRanatunga Czy możesz rozwinąć? Widzę, jak pominięcie wartości pustej uniemożliwiłoby wnioskowanie typu, ale nie widzę sposobu, w jaki rozwiązałoby problem określania konkretnego typu T. – cqcallaw

+1

Użyj 'defaultValue.getClass()', aby uzyskać typ jako 'defaultValue.getClass()'. Klasa '. – BalusC

1

Chcesz obiekt, który parsuje określony typ w określony sposób. Oczywiście nie jest możliwe określenie sposobu analizowania dowolnego typu tylko z typu. Prawdopodobnie potrzebujesz pewnej kontroli nad sposobem parsowania. Czy są na przykład przecinki w porządku? Czy należy przyciąć białe spacje?

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

typy pojedyncze Streszczenie metoda powinna być nadzieją mniej gadatliwy wdrożyć w Java SE 8.

+0

Na szczęście dobra kontrola nad mechanizmami parsowania jest niepotrzebna dla moich celów. Wystarczy, jeśli powrócisz do wartości domyślnej, jeśli przetwarzanie nie powiedzie się. – cqcallaw

0

Być może nie odpowiedzieć na pytanie, jak wdrażać rozwiązania, ale jest biblioteka, która robi dokładnie to (czyli ma prawie identyczne API, zgodnie z życzeniem). To się nazywa type-parser i mogą być wykorzystane coś takiego:

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