Я хотел бы создать общий метод, который делает фактически это:Java дженериков и числовые типы
class MyClass {
static <T extends Number> T sloppyParseNumber(String str) {
try {
return T.valueOf(str);
} catch (Exception e) {
return (T)0;
}
}
}
Теперь выше не компилируется по двум причинам: нет Number.valueOf()
метод и 0 не может быть приведен к T
.
Пример использования:
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);
реализует выше общего способа возможно с Java? Если да, то как? Если нет, то какой хороший альтернативный подход?
Редактировать: похоже, существует несколько возможных дубликатов, но я не нашел один, который охватывает именно это. Я надеюсь, что есть какой-то трюк, который позволил бы этим двум операциям: разбить строку на подкласс Number
и вернуть значение 0 для подкласса Number
.
['Number'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Number.html) абстрактный класс не содержит никакого метода для синтаксического анализа строки для типа, поскольку синтаксический анализ выполняется определенным типом. Предложение состоит в том, чтобы не использовать общий, но создавать такие функции, как '... ToInteger',' ... ToDouble' и так далее. –
Я не думаю, что есть простой способ сделать это. Я просто использовал бы что-то вроде 'new MyClass (value) .asDouble();' и реализовал методы 'asInteger',' asLong', 'asFloat',' asDouble' и т. Д. Вручную – assylias
'T.valueOf()' wouldn ' t, даже если существует статический метод 'Number.valueOf()'; вы просто не можете использовать такие общие типы. –