关于语法:Java是否允许可为空的类型?

Does Java allow nullable types?

在C#中,我可以使用一个变量来允许带问号的null。 我想要一个真/假/空结果。 我想将其默认设置为null。 测试结果会将布尔值设置为true / false,但有时测试不会运行,并且java中的boolean默认为false,因此要进行测试的第三个选项会很好。

C#示例:

1
bool? bPassed = null;

java是否有与此类似的东西?


没有。

相反,您可以使用带框的Boolean类(这是一个普通类而不是原始类型),或者使用三个值的enum


您可以使用 :

Boolean b = null;

即Java中的java.lang.Boolean对象。

然后通过一个简单的赋值设置true或false:

Boolean b = true;
要么
Boolean b = false;


不可以,在Java原语中不能具有null值,如果要使用此功能,则可能要使用布尔值。


当然,您可以使用布尔值,但是要使您的类型可以具有"值"或"无值"这一点更加明显,可以很容易地创建一个包装类,该包装类或多或少地执行?类型在C#中的作用:

1
2
3
4
5
6
7
8
9
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; }
}

然后,您可以像这样使用它:

1
2
3
4
5
6
7
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


是的你可以。

为此,java为每种基本类型都提供了一个包装器类。如果将变量作为包装器类的实例,则可以像普通变量一样为它分配null

代替:

1
boolean myval;

... 您可以使用:

1
Boolean myval = null;

您可以像这样分配它:

1
myval = new Boolean(true);

...并像这样获取其原始值:

1
2
3
if (myval.booleanValue() == false) {
  // ...
}

每个基本类型(intBooleanfloat,...)都有对应的包装器类型(IntegerBooleanfloat,...)。

Java的自动装箱功能使编译器有时可以自动将包装器类型强制为其原始值,反之亦然。但是,如果编译器无法解决问题,您始终可以手动进行操作。


在Java中,基本类型不能为null。但是,您可以使用Boolean和朋友。


如果使用对象,则允许null

如果使用的是原始数据类型,则不允许null

那就是Java具有包装器类的原因


否,但是您可以使用Boolean类而不是原始的Boolean类型来放置null