как использовать дженерики в Java с языковыми операторами и расширением родового класса - PullRequest
5 голосов
/ 06 июля 2011

Я хотел бы выполнить операцию над двумя обобщенными аргументами одного и того же типа, расширяющими Number.

Возможно ли это? Я всегда вызывал методы для общих аргументов, но, похоже, есть проблема с использованием операторов (Оператор + не определен для типа (ов) аргументов T, T).

public static <T extends Number> T sum(T a, T b){
    return a+ b;
}

Что я делаю не так?

EDIT: Я стараюсь немного улучшить свой вопрос. Я понял, что операторы не определены для типа Number. Это немного грустно, потому что было бы неплохо выполнить такую ​​операцию, не вводя новые интерфейсы, подобные предложению @Victor Sorokin.

Но я все еще не понимаю одну вещь: если операторы не реализованы в классе Number, то, по крайней мере, в классе Double должны быть реализованы, потому что я могу использовать оператор + с double. Ни одна из этих строк кода не скомпилируется:

public static <T extends Double> T sum(T a, T b){

    T c = a +b;
}

почему

Ответы [ 2 ]

4 голосов
/ 06 июля 2011

Это невозможно, поскольку с Number не связан оператор +. В частности, вы не можете сделать это:

Number a = new Integer(1);
Number b = new Integer(2);
Number c = a + b;
2 голосов
/ 06 июля 2011

Не существует оператора + для классов в Java (кроме String, и есть неявное преобразование для других типов через toString(), когда одним из аргументов является String). Итак, заставьте вас ввести некоторый интерфейс, скажем

interface Valuable {
    // use richest built-in numeric type
    double value();
    Valuable value(double v);
}

public static <T extends Valuable> T sum(T a, T b){
    return a.value(a.value() + b.value());
}

Ужасно, не правда ли? = D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...