Разрешает ли Java обнуляемые типы? - PullRequest
29 голосов
/ 21 сентября 2011

В C # я могу переменную, чтобы разрешить нули с вопросительным знаком.Я хочу получить истинный / ложный / нулевой результат.Я хочу, чтобы он был установлен в ноль по умолчанию.По результатам теста логическое значение будет установлено в true / false, но иногда тест не запускается, а логическое значение по умолчанию равно false в java, поэтому третий вариант для проверки был бы хорош.

c # пример:

bool? bPassed = null;

Есть ли в Java что-нибудь похожее на это?

Ответы [ 8 ]

39 голосов
/ 21 сентября 2011

Нет.

Вместо этого вы можете использовать класс Boolean в штучной упаковке (который является обычным классом, а не примитивным типом) или трехзначный enum.

15 голосов
/ 21 сентября 2011

вы можете использовать:

Boolean b = null;

, то есть объект java.lang.Boolean в Java.

И затем также установить true или false простым назначением:

Boolean b = true; или Boolean b = false;

8 голосов
/ 21 сентября 2011

Да, вы можете.

Чтобы сделать это, в java есть класс-оболочка для каждого примитивного типа. Если вы сделаете вашу переменную экземпляром класса-оболочки, ей можно присвоить null, как и любой нормальной переменной.

Вместо:

boolean myval;

... вы можете использовать:

Boolean myval = null;

Вы можете назначить это так:

myval = new Boolean(true);

... И выведите его примитивное значение так:

if (myval.booleanValue() == false) {
  // ...
}

Каждый тип примитива (int, boolean, float, ...) имеет соответствующий тип оболочки (Integer, Boolean, Float, ...).

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

7 голосов
/ 21 сентября 2011

Нет, в java примитивы не могут иметь нулевое значение, если вы хотите эту функцию, вы можете использовать Boolean вместо.

5 голосов
/ 18 июля 2015

Конечно, вы можете использовать Boolean, но чтобы сделать более очевидным, что ваш тип может иметь «значение» или «не иметь значения», очень легко создать класс-оболочку, который делает более или менее то же, что и типы ? вC #:

public class Nullable<T> {
    private T value;
    public Nullable() { value = null; }
    public Nullable(T init) { value = init; }
    public void set(T v) { value = v; }
    public boolean hasValue() { return value != null; }
    public T value() { return value; }
    public T valueOrDefault(T defaultValue) { return value == null ? defaultValue : value; }
}

Затем вы можете использовать его следующим образом:

private Nullable<Integer> myInt = new Nullable<>();
...
myInt.set(5);
...
if (myInt.hasValue()) 
   ....
int foo = myInt.valueOrDefault(10);

Обратите внимание, что нечто подобное является стандартным с Java8: класс Optional.https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

5 голосов
/ 21 сентября 2011

В Java примитивные типы не могут быть нулевыми. Однако вы можете использовать Boolean и друзей.

2 голосов
/ 21 сентября 2011

Нет, но вы можете использовать Boolean класс вместо примитива boolean типа, чтобы поставить null

1 голос
/ 21 сентября 2011

Если вы используете объект, он позволяет null

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

Что причина в Java Класс Wrapper

...