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

Обновление: спасибо, теперь я понимаю, что то, что написано ниже, сделать невозможно.

Let's say I want to create an add method for Integer and I would like it to work this way: x.add(y), where x and y are Integers. Is there a possibility to do this? The only thing I can think of is to create a different class that extends Integer and add a method for it, but is there any other way?

Чтобы быть ясным, причина, по которой я задавал это в первую очередь, заключается в том, что мне нужно создать общий класс, который должен уметь, например, добавлять как для Integer, так и для BigInteger, и я не хочу делать, если случаи это проверить, какой класс T для этого. Поэтому я подумал, что было бы полезно, если бы можно было сделать вышеупомянутое. Мне пока непонятно, как это сделать. Извините за такой непонятный вопрос.


P.S. Я новичок в Java и не являюсь носителем английского языка, поэтому я понимаю, что вопрос может быть очень глупым или на него уже был дан ответ, если это так, извините.

Нет, вы не можете добавлять методы к классам в JDK. И поскольку Integer помечен как final, вы не можете его расширить.

Dawood ibn Kareem 21.04.2018 10:22

Вам не нужно добавлять этот метод. См .: docs.oracle.com/javase/tutorial/java/data/autoboxing.html Но обратите внимание, что примитивные оболочки, а также String неизменяемы.

Uwe Voigt 21.04.2018 10:23

вы не можете изменить классы в существующей библиотеке JDK! Вам придется писать в свой класс.

nitnamby 21.04.2018 10:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

ОБНОВЛЕНО:

Just to be clear, the reason I was questioning it in the first place is that I need to create a generic class that should be able to do, for example, addition both for Integer and BigInteger and I don't want to make if cases that check what class is T to do that.

Почему бы не использовать java.lang.Number в качестве универсального типа, Integer и BigInteger являются подклассами java.lang.Number.

Нет, вы не можете добавить метод в Integer или создать класс, расширяющий Integer, потому что Integer - это final, конечные классы не могут быть унаследованы в Java.

Если вы просто хотите добавить два объекта Integer, просто используйте +, потому что в Java есть автоматическая упаковка и распаковка, проверьте это: https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.7.

Вы можете создать класс util, чтобы предоставить статический метод для решения этой проблемы:

class Integers {
    public static Integer add(Integer i1, Integer i2) {
        return i1 + i2;
    }
}

Кстати, вы можете добавить методы расширения в Kotlin, где вы можете делать такие вещи, как 1.plus(2), для выполнения операций плюс.

У меня непонятный вопрос. Если вы хотите создать метод добавления внутри существующего класса Целое число, вы не можете создать его, потому что он окончательный. Вместо этого вы можете создать метод добавления в своем собственном классе.

public int add (Integer a, Integer b) {
  return a + b;
}

Звонил C99. Он хочет вернуть свою функцию. ^^

Turing85 21.04.2018 10:35

@ Turing85 Почему вы упомянули C99? Я не понимаю C99 в Java

jmingrove21 21.04.2018 10:38

Это была шутка. Поскольку C имеет только структуры, а не классы, а структуры не имеют функций-членов. C-способ делать что-то - писать функции и передавать структуру. По сути, это то, что вы сделали для Integer, но это приводит к разделению объекта и его поведения, что, в свою очередь, снижает удобочитаемость.

Turing85 21.04.2018 10:42

@ Turing85 О, я никогда об этом не думал. Извините за серьезные ответы на смешные ответы :)

jmingrove21 21.04.2018 10:44

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