Как преобразовать общий тип в строку

#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 интерфейса, а затем добавить их