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

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

Я пытался использовать функцию 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
public static <T extends Number> String add(T a, T b)
Aniket Sahrawat 21.04.2019 11:45

Как a instanceof String было бы правдой, если бы T extends Number?

Andy Turner 21.04.2019 11:45

Кроме того: использование instanceof внутри универсального метода, подобного этому, упускает суть дженериков.

Andy Turner 21.04.2019 11:46

@AniketSahrawat, если я использую String в качестве типа возвращаемого значения, это вызовет ошибки для двух других случаев, то есть для целого числа и двойного числа!

Linux Geek 21.04.2019 11:46

@AndyTurner Я новичок в дженериках, поэтому пытаюсь их использовать! Я не знаю, как это упускает из виду дженерики! Думаю, я должен узнать больше об этом тогда!

Linux Geek 21.04.2019 11:47

Смысл дженериков в том, чтобы разрабатывать методы, которые работают с что бы ни фактическим типом T. Не писать методы, которые работают только в том случае, если T является Integer или Double, и не работают для всех остальных типов Number. То, что вы пытаетесь сделать, невозможно сделать с помощью дженериков.

JB Nizet 21.04.2019 11:54

@JBNizet, но я не смог добавить значения, если не использовал instanceof! Есть ли какая-то война, которая помогает добавлять дженерики друг к другу?

Linux Geek 21.04.2019 11:56

Нет. Как я уже сказал в своем предыдущем комментарии, то, что вы пытаетесь сделать, невозможно сделать с помощью дженериков.

JB Nizet 21.04.2019 11:57

@JBNizet спасибо! Есть ли другой способ без (дженериков)?

Linux Geek 21.04.2019 11:58

Нет.

JB Nizet 21.04.2019 12:00

Подумайте о ArrayList<T>, списку не нужно знать тип объекта, который вы храните, поскольку он обеспечивает общую функциональность для всех типов. Наличие ArrayList, которое хранит вещи по-разному в зависимости от типа объекта, как бы противоречит цели. Вы можете решить проблему, которую пытаетесь решить, используя дженерики плюс наследование или перегруженные методы IMO для каждого типа, которые могут быть лучше.

StaticBeagle 21.04.2019 12:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
3 417
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш общий тип T объявлен расширяющим Number. String не продлевается Number. И в этом корень вашей проблемы. Либо ваши входящие параметры a и b расширяют номер и, следовательно, могут не относиться к типу String, либо ваш универсальный тип T может не расширяться Number.

Другое решение состоит в том, чтобы иметь свой метод как есть, а не иметь дело с типом String и добавить другой метод, который получает 2 параметра String. Однако обратите внимание, что добавление 2 строк просто объединяет их, поэтому «2» + «4» даст вам «24», что, вероятно, не то, что вы хотите/ожидаете. Если вы ожидаете, что строки представляют собой числовые значения, вам нужно будет написать собственный код для анализа ваших параметров String в Integer или Long или другую реализацию интерфейса Number, а затем добавить их.

Другие вопросы по теме