2

编辑

这主要是关于为什么类存在的问题,而不是类的用法。问题用于 Java Void 引用类型?侧重于实际用法,这个问题询问其实施背后的原因。


Java 有一个Void用于关键字返回类型的盒装类void

从文档:

Void 类是一个不可实例化的占位符类,用于保存对表示 Java 关键字 void 的 Class 对象的引用。

我看到这个类使用的唯一情况是泛型,例如:

interface Foo<R> {
    R foo();
}

Foo<Void> foo = new Foo<Void>(){
    @Override
    public Void foo() {
        return null; //  `return;` and `return void;` are syntax errors 
    }
}

这方面的一个例子是 Android 的AsyncTask.

上面的例子似乎完全没有意义,因为方法不返回void它总是返回null

那么告诉我,为什么Void存在?

4

2 回答 2

2

Reflection API 需要它来表示 void 方法的返回类型,因为java.lang.reflect.Method.getReturnType().(严格来说这void.class,不是Void.class,,而是编译器强制void.class转换为Void.TYPE.)。它还用于其他几个地方,如使用页面中所示它的 Javadoc

于 2013-11-08T04:35:20.150 回答
1

Void 是伪类型的 void holder

public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

从 1.1 开始还没有泛型。当我们需要 void.class 时,例如这里

Class rt = Test1.class.getMethod("x").getReturnType();
if (rt == void.class) {
   ...

编译器将 void.class 替换为对 java.lang.Void.TYPE 的引用

  ALOAD 1
  GETSTATIC java/lang/Void.TYPE : Ljava/lang/Class;
  IF_ACMPNE
  ...
于 2013-11-08T04:53:45.930 回答