#java #string #generics
#java #строка #общие
Вопрос:
Я пишу функцию, которая использует общие параметры и преобразует их в их конкретный тип данных, добавляет их и возвращает добавленное значение. Я сделал это для integer и double, но не могу сделать то же самое для строки
Я пытался использовать функцию toString(), а также строковый конструктор, но, похоже, ничего не работает!
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
Комментарии:
1.
public static <T extends Number> String add(T a, T b)
2. Как было бы
a instanceof String
верно, еслиT extends Number
?3. Кроме того: использование
instanceof
внутри универсального метода, подобного этому, упускает из виду суть дженериков.4. Суть дженериков заключается в разработке методов, которые работают независимо от фактического типа T . Не писать методы, которые работают только в том случае, если T является либо целым числом, либо двойным, и терпят неудачу для всех других числовых типов. То, что вы пытаетесь сделать, невозможно сделать с помощью generics.
5. Подумайте
ArrayList<T>
, списку не нужно знать тип объекта, который вы храните, поскольку он предоставляет общие функциональные возможности для всех типов. НаличиеArrayList
объекта, который хранит вещи по-разному в зависимости от типа объекта, как бы противоречит цели. Вы можете решить проблему, которую пытаетесь решить, используя generics plus наследование или IMO, перегруженные методы для каждого типа могут быть лучше.
Ответ №1:
Ваш общий тип T
объявлен как extend Number
. String
не расширяется Number
. И это корень вашей проблемы. Либо ваши входящие параметры a
и b
расширенный номер и, следовательно, могут не иметь типа String
, либо ваш T
общий тип может не расширяться Number
.
Другое решение — сохранить ваш метод таким, какой он есть, и не иметь там дело с String
типом и добавить другой метод, который получает 2 String
параметра. Однако обратите внимание, что добавление 2 строк просто объединяет их, поэтому «2» «4» даст вам «24», что, вероятно, не то, что вы хотите / ожидаете. Если вы ожидаете, что строки будут представлять числовые значения, вам нужно будет написать свой собственный код для анализа ваших String
параметров Integer
или Long
или другой реализации Number
интерфейса, а затем добавить их