Я пишу функцию, которая использует общие параметры и преобразует их в их конкретный тип данных, добавляет их и возвращает добавленное значение. Я сделал это для целого и двойного числа, но не могу сделать то же самое для строки
Я пытался использовать функцию toString(), а также конструктор String, но ничего не работает!
public static <T extends Number> T add(T a, T b) {
if (a instanceof Integer) {
return (T) Integer.valueOf(a.intValue() + b.intValue());
} else if (a instanceof Double) {
return (T) Double.valueOf(b.doubleValue() + b.doubleValue());
} else if (a instanceof String) {
return (T) String.valueOf(a.toString() + b.toString());
}
}
Я ожидаю, что он должен возвращать аргумент универсального типа, но он выдает пару ошибок времени компиляции:
java: incompatible types: T cannot be converted to java.lang.String
а также
ava: incompatible types: java.lang.String cannot be converted to T
Как a instanceof String было бы правдой, если бы T extends Number?
Кроме того: использование instanceof внутри универсального метода, подобного этому, упускает суть дженериков.
@AniketSahrawat, если я использую String в качестве типа возвращаемого значения, это вызовет ошибки для двух других случаев, то есть для целого числа и двойного числа!
@AndyTurner Я новичок в дженериках, поэтому пытаюсь их использовать! Я не знаю, как это упускает из виду дженерики! Думаю, я должен узнать больше об этом тогда!
Смысл дженериков в том, чтобы разрабатывать методы, которые работают с что бы ни фактическим типом T. Не писать методы, которые работают только в том случае, если T является Integer или Double, и не работают для всех остальных типов Number. То, что вы пытаетесь сделать, невозможно сделать с помощью дженериков.
@JBNizet, но я не смог добавить значения, если не использовал instanceof! Есть ли какая-то война, которая помогает добавлять дженерики друг к другу?
Нет. Как я уже сказал в своем предыдущем комментарии, то, что вы пытаетесь сделать, невозможно сделать с помощью дженериков.
@JBNizet спасибо! Есть ли другой способ без (дженериков)?
Нет.
Подумайте о ArrayList<T>, списку не нужно знать тип объекта, который вы храните, поскольку он обеспечивает общую функциональность для всех типов. Наличие ArrayList, которое хранит вещи по-разному в зависимости от типа объекта, как бы противоречит цели. Вы можете решить проблему, которую пытаетесь решить, используя дженерики плюс наследование или перегруженные методы IMO для каждого типа, которые могут быть лучше.




Ваш общий тип T объявлен расширяющим Number. String не продлевается Number. И в этом корень вашей проблемы. Либо ваши входящие параметры a и b расширяют номер и, следовательно, могут не относиться к типу String, либо ваш универсальный тип T может не расширяться Number.
Другое решение состоит в том, чтобы иметь свой метод как есть, а не иметь дело с типом String и добавить другой метод, который получает 2 параметра String. Однако обратите внимание, что добавление 2 строк просто объединяет их, поэтому «2» + «4» даст вам «24», что, вероятно, не то, что вы хотите/ожидаете. Если вы ожидаете, что строки представляют собой числовые значения, вам нужно будет написать собственный код для анализа ваших параметров String в Integer или Long или другую реализацию интерфейса Number, а затем добавить их.
public static <T extends Number> String add(T a, T b)