Chciałbym stworzyć ogólną metodę, która działa skutecznie to:rodzajowych Java i typy liczbowe
class MyClass {
static <T extends Number> T sloppyParseNumber(String str) {
try {
return T.valueOf(str);
} catch (Exception e) {
return (T)0;
}
}
}
Teraz powyżej nie skompilować z dwóch powodów: nie ma Number.valueOf()
metoda i 0 nie może być oddane do T
.
Przykład użycia:
String value = "0.00000001";
System.out.println("Double: " + MyClass.<Double>sloppyParseNumber(value));
System.out.println("Float: " + MyClass.<Float>sloppyParseNumber(value));
double d = MyClass.sloppyParseNumber(value);
float f = MyClass.sloppyParseNumber(value);
wdraża powyżej metoda rodzajowa możliwie z Java? Jeśli tak, w jaki sposób? Jeśli nie, jakie jest dobre alternatywne podejście?
Edytuj: wydaje się, że istnieje kilka możliwych duplikatów, ale nie znalazłem jednego, który obejmuje dokładnie to. Mam nadzieję, że jest jakaś sztuczka do pobrania, która pozwoliłaby na te dwie operacje: łańcuch parsowania do podklasy Number
i powrót do wartości 0 dla podklasy Number
.
['Numer'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Numer.html) Klasa abstrakcyjna nie zawiera żadnej metody analizy łańcucha do typu, ponieważ przetwarzanie odbywa się według określonego typu. Sugestia polega na tym, aby nie używać generycznego, ale tworzyć funkcje takie jak "... ToInteger',' ... ToDouble' i tak dalej. –
Nie sądzę, jest łatwy sposób to zrobić. Po prostu użyłbym czegoś takiego jak 'new MyClass (value) .asDouble();' i zaimplementuj metody 'asInteger',' asLong', 'asFloat',' asDouble' itd. Manualnie – assylias
'T.valueOf()' wouldn ' t działa, nawet jeśli istnieje statyczna metoda 'Number.valueOf()'; po prostu nie można używać takich ogólnych typów. –