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 подходит, поэтому его тип покрывается. В этом случае это просто неявное приведение (распаковка), что совершенно нормально.

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