как написать общий метод добавления чисел [дубликат]

этот вопрос уже есть ответ здесь:

Я хочу, чтобы определить метод, чтобы сделать суммы между номера разных типов:

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