Подтвердить что ты не робот

Как передать null методу, который ожидает long или int?

Может быть, глупый вопрос, но как передать null методу, который принимает long или int?

Пример:

TestClass{
  public void iTakeLong(long id);
  public void iTakeInt(int id);
}

теперь, как я могу передать значение null методам:

TestClass testClass = new TestClass();
testClass.iTakeLong(null); // Compilation error : expected long, got null
testClass.iTakeInt(null);   // Compilation error : expected int, got null

Мысли, предложения?

4b9b3361

Ответ 1

Проблема заключается в том, что int и long являются примитивами. Вы не можете передать null в примитивное значение.

В вашей сигнатуре метода вы можете использовать классы-оболочки Integer и long вместо long и int.

Ответ 2

Вы не можете - нет такого значения. Если вы можете изменить подпись метода, вы можете заставить его вместо этого использовать ссылочный тип. Java предоставляет неизменяемый класс "wrapper" для каждого примитивного класса:

class TestClass {
  public void iTakeLong(Long id);
  public void iTakeInt(Integer id);
}

Теперь вы можете передать нулевую ссылку или ссылку на экземпляр типа обертки. Автобоксинг позволит вам написать:

iTakeInt(5);

Внутри метода вы можете написать:

if (id != null) {
    doSomethingWith(id.intValue());
}

или используйте автоматическую распаковку:

if (id != null) {
    doSomethingWith(id); // Equivalent to the code above
}

Ответ 3

Вы можете присвоить null классу-не-примитиву, который будет компилироваться.

TestClass testClass = new TestClass();
testClass.iTakeLong( (Long)null); // Compiles
testClass.iTakeInt( (Integer)null);   // Compiles

Но при выполнении будет выбрано NullPointerException. Не очень помогает, но полезно знать, что вы можете передать оболочку, эквивалентную методу, который принимает примитив как аргумент.

Ответ 4

В зависимости от того, сколько у вас таких методов и сколько звонков у вас есть другой выбор.

Вместо распределения нулевых проверок на всей вашей кодовой базе вы можете писать методы-оболочки (N.B., а не обертки типа (int = > Integer), но методы, которые обертывают ваши):

public void iTakeLong(Long val) {
    if (val == null) { 
        // Do whatever is appropriate here... throwing an exception would work
    } else {
        iTakeLong(val.longValue());
    }
}

Ответ 5

Используйте классы Wrapper:

 TestClass{
    public void iTakeLong(Long id);
    public void iTakeInt(Integer id);
    public void iTakeLong(long id);
    public void iTakeInt(int id);
 }

Ответ 6

Вы не можете этого сделать. Примитивные типы не могут быть null в Java.

Если вы хотите передать null, вы должны изменить свою подпись метода на

public void iTakeLong(Long id);
public void iTakeInt(Integer id);

Ответ 7

Указание значения на Long, как показано ниже, приведет к исчезновению ошибки компиляции, но в конечном итоге окажется в NullPointerException.

testClass.iTakeLong((Long)null)

Одним из решений является использование типа Long вместо примитива Long.

public void iTakeLong(Long param) { }

Другим решением является использование org.apache.commons.lang3.math.NumberUtils

testClass.iTakeLong(NumberUtils.toLong(null))