Java是否允许可以为空的类型?

Gre*_*een 32 java syntax null

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

c#示例:

bool? bPassed = null;
Run Code Online (Sandbox Code Playgroud)

java有类似的东西吗?

SLa*_*aks 41

没有.

相反,您可以使用盒装Boolean类(它是普通类而不是基本类型)或三值enum.

  • @ToolmakerSteve:不; 它们在很多方面都不一样. (3认同)
  • 换句话说,“是”,因为相应的类的行为类似于 C# 等效项(除了 C# 版本是一个结构体,而 Java 版本是一个类)。 (2认同)

Sak*_*ket 16

您可以使用 :

Boolean b = null;

也就是java.lang.BooleanJava中的对象.

然后通过简单的赋值设置truefalse:

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


ami*_*mit 9

不,在java 原语中不能有空值,如果你想要这个功能,你可能想要使用布尔代替.


Jos*_*eph 7

是的你可以.

为了做到这一点,java为每个基本类型都有一个包装类.如果将变量设置为包装类的实例,则可以null像任何常规变量一样分配它.

代替:

boolean myval;
Run Code Online (Sandbox Code Playgroud)

... 您可以使用:

Boolean myval = null;
Run Code Online (Sandbox Code Playgroud)

您可以像这样分配:

myval = new Boolean(true);
Run Code Online (Sandbox Code Playgroud)

......并像这样获得原始价值:

if (myval.booleanValue() == false) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

每个基本类型(int,boolean,float,...)都有一个相应的包装类型(Integer,Boolean,Float,...).

Java的自动装箱功能允许编译器有时自动将包装器类型强制转换为其原始值,反之亦然.但是,如果编译器无法解决问题,您可以随时手动执行此操作.


NPE*_*NPE 5

在Java中,原始类型不能为null.但是,你可以Boolean和朋友一起使用.


gee*_*rt3 5

当然,您可以使用布尔值,但要使您的类型可以具有“值”或“无值”这一点更加明显,可以很容易地创建一个包装类,该包装类或多或少地?执行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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,自Java8开始,类似的东西是标准的:Optional类。 https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html