Java неявно вызывает intValue при передаче Integer в качестве аргумента
Итак, я обнаружил ошибку, вызванную следующим примером: у меня есть статический метод
private static Foo findFoo(int id) {
//we use id here not important
}
Затем я использовал его в другом методе, например
private static updateFoo(final Integer id, final String newData) {
final Foo existingData = findFoo(id);
// use existing data and update or make new
}
Проблема в том, когда
updateFoo
называется с
null
в
id
аргумент,
intValue()
неявно вызывается (я думаю) при вызове
findFoo(id)
и вызывает НПЭ.
Я думал, что Java обеспечивает строгую типизацию, которая предотвращает случаи, когда объекты передаются аргументам, когда ожидаются примитивы. Есть ли здесь какое-то общее правило, когда делаются неявные звонки? И может ли это быть обнаружено компилятором /IDE и, возможно, принудительно или предупреждено?
1 ответ
Это всегда происходит, если вы используете класс-оболочку как его примитивный аналог.
int
не может быть нулевым, поэтому вы должны позвонить
intValue()
на класс-оболочку.
Вы можете выполнить нулевую проверку перед вызовом
findFoo()
или просто используйте примитив
int
за
updateFoo()
или класс-оболочка в
findFoo()
.
Я думал, что Java обеспечивает строгую типизацию, которая предотвращает случаи, когда объекты передаются аргументам, когда ожидаются примитивы.
Тип Integer подходит, поэтому его тип покрывается. В этом случае это просто неявное приведение (распаковка), что совершенно нормально.