java.lang.void 和 void 有什么区别?

2022-08-31 12:47:47

在 API 中

“Void 类是一个无法证实的占位符类,用于保存对表示 Java 关键字 void 的 Class 对象的引用。

  1. 什么是“不可证实”占位符类?何时使用?如果类是“不可证实的”,它有什么用?java.lang.Void
  2. 和 有什么区别?java.lang.Voidvoid

答案 1

java.lang.Void类似于 java.lang.Integer。 是框定基元类型值的一种方式。 是框定基元类型值的一种方式。IntegerintVoidvoid

“但是等等,没有任何可能的值!”void

右!这就是“无法证实”的原因。:)java.lang.Void

Java类型系统的一个很好的功能是每个基元类型都有一个盒装的等价物。 有 , 有 , 有 ...并具有 .如果不存在,那将是奇怪和不对称intIntegerlongLongbyteBytevoidVoidVoid

“那么 和 有什么区别呢?”java.lang.Voidvoid

容易。 是基元类型。 是继承自 的引用类型。它们的相似之处在于它们都没有任何可能的值;但尽管如此,从类型系统的角度来看,它们是两种截然不同的类型。voidVoidObject

“但我在我的程序中没有任何用处。Void

而且我对我没有任何用处。某些功能没有非模糊的用途。没关系。GarbageCollectorMXBean


答案 2

Void最常见的用途是用于反射,但这不是唯一可以使用它的地方。

void是一个关键字,表示函数不生成值。

java.lang.Void是引用类型,则以下内容有效:

 Void nil = null;

(到目前为止,这并不有趣...)

作为结果类型(返回值为 type 的函数),它意味着函数 *always * 返回(它不能返回 除 以外的任何内容,因为没有实例)。VoidnullnullVoid

 Void function(int a, int b) {
    //do something
    return null;
 }

为什么我想要一个总是返回 null 的函数?

在泛型发明之前,我没有.Void

对于泛型,有一些有趣的情况。例如,Future<T>是另一个线程执行的异步操作的结果的持有者。 将返回操作值(类型),并将阻塞,直到执行计算。Future.getT

但。。。如果没有什么可返回的怎么办?简单:使用 .例如,在 Google App Engine 中,异步数据存储服务删除操作会在删除完成后返回 futureget()null'。可以用 Callables 写一个类似的例子。Future<Void>. Whenis invoked on that future,

另一个用例是 无值,即 .这样的映射表现得像一个,那么当没有等效的实现时,它可能是有用的(例如,没有,那么可以使用WeakHashMap<T,Void>)。MapMap<T,Void>Set<T>SetWeakHashSet