public Long addIntegers(Integer a, Integer b) {
Integer sum = a + b;
return sum;
}
Вы почти правы с этим. Я понимаю, почему вы думаете, что это сработает, но вы не можете перейти от Integer -> Long
ни к явному, ни к кастингу. Вам нужно будет пройти Integer -> int -> long -> Long
, а Java может сделать только 1 скачок неявно .
Сначала давайте посмотрим, что на самом деле делает a + b
. Он распаковывает a
и b
из Integer
s в примитивные int
s и складывает их вместе, в результате получается int
. Затем он автоматически упаковывает это в Integer
, потому что это тип переменной sum
, которую вы определили.
Но подождите, мы видим выше (Integer -> int -> long -> Long
), что Integer
на самом деле дальше от того места, где мы хотим быть, а не ближе!
Итак, давайте вернемся к a + b
, который возвращает int
. Мы хотим Long
. Мы могли бы привести результат к long
:
public Long addIntegers(Integer a, Integer b) {
return (long) (a + b);
}
В таком случае у нас есть int
- результат нашего выражения суммы - и мы явно приводим к long
, а Java делает последний неявный шаг и автоматически переносит его в Long
.
Тем не менее, хотя в нашем случае это нормально, это часто признак плохого дизайна, поэтому я стараюсь по возможности избегать его использования. К счастью, в нашем случае мы можем избежать броска. Нам просто нужно переключить неявный шаг и явный шаг (т.е. неявно преобразовать из int -> long
и явно преобразовать из long -> Long
)
public Long addIntegers(Integer a, Integer b) {
return Long.valueOf(a + b);
}
В этом примере Long.valueOf
принимает примитив long
и возвращает Long
, но наши вычисления a + b
возвращают int, поэтому Java неявно преобразует int
в long
.