как написать общий метод добавления чисел [дубликат]
этот вопрос уже есть ответ здесь:
- Java Generics и сложение чисел вместе 5 ответов
Я хочу, чтобы определить метод, чтобы сделать суммы между номера разных типов:
<T> void add (T one, T two)
{
T res = one + two;
}
вышеуказанный метод не работает, потому что тип erasure convert T
на Object
и таким образом оператор + не определено на Object
...
как это сделать?
спасибо.
4 ответов
вам придется использовать параметр ограниченного типа:
public <T extends Number> double add (T one, T two)
{
return one.doubleValue() + two.doubleValue();
}
обратите внимание, что он использует double как тип возврата, потому что это примитивный числовой тип, который охватывает наибольший диапазон значений - и один или оба параметра могут быть double
тоже. Обратите внимание, что Number
также BigDecimal
и BigInteger
как подклассы, которые могут представлять значения вне диапазона double
. Если вы хотите правильно обрабатывать эти случаи, это сделает метод намного сложнее (вам придется начать обработку разные виды различны).
"самое простое" решение, которое я могу придумать, это (извините за кастинг и автоматический бокс/распаковку):
@SuppressWarnings("unchecked")
<T> T add(T one, T two) {
if (one.getClass() == Integer.class) {
// With auto-boxing / unboxing
return (T) (Integer) ((Integer) one + (Integer) two);
}
if (one.getClass() == Long.class) {
// Without auto-boxing / unboxing
return (T) Long.valueOf(((Long) one).longValue() +
((Long) two).longValue());
}
// ...
}
добавить столько типов, которые вы хотите поддержать. При желании, вы могли бы справиться null
Как хорошо...
посмотрите на это обсуждение на SO:Как добавить два java.ленг.Цифры?
Это примерно то же самое, что и ваша проблема. В любом случае, вы не должны использовать дженерики, для этого, почему? Просто: потому что с дженериками вы не могли добавить Float и Double, что в целом вы должны уметь делать!
template <class A>
A add (A a, A b)
{
return (a+b);
}
int main()
{
int x =10, y =20;
cout <<"The Integer Addition is " << add(x,y);
return 0;
}