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

在API中

“Void类是一个不合理的占位符类,用于保存对表示Java关键字void的Class对象的引用。

  1. 什么是“不合理”的持有人类? 什么时候会使用java.lang.Void ? 如果这个class是“不合理的”,那有什么用呢?
  2. java.lang.Voidvoid什么区别?

Void唯一一点是保持Void.TYPE ,就像void.class 。 如果你有一个返回void的方法的reflection引用,并且你得到它的返回types,它将返回Void.TYPE

你不能,也不应该把它用于其他任何事情。

java.lang.Void类似于java.lang.IntegerInteger是一种对原始typesint进行装箱的方法。 Void是一种对原始typesvoid进行装箱的方法。

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

对! 这就是使java.lang.Void “不合理”的原因。 🙂

Javatypes系统的一个很好的特性是每个原始types都有一个盒装的等价物。 intIntegerlongLongbyteByte …, voidVoid 。 如果Void 存在,这将是奇怪的和不对称的。

“那么java.lang.Voidvoid之间有什么区别呢?

简单。 void是一个原始types。 Void是从Objectinheritance的引用types。 他们是相似的,他们都没有任何可能的价值; 但从types体系的angular度来看,它们是两种截然不同的types。

“但是我的程序中没有使用Void 。”

而我在我的GarbageCollectorMXBean没有任何用处。 有些function没有非晦涩的用途。 没关系。

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

void是一个关键字,意味着一个函数不会产生一个值。

java.lang.Void是一个引用types,那么以下是有效的:

  Void nil = null; 

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

因此,type(一个返回值types为Void的函数)意味着函数* always *返回null (它不能返回null以外的任何东西,因为Void没有实例)。

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

为什么我会喜欢一个总是返回null的函数?

在generics的发明之前,我没有使用Void的用例。

有了generics,有一些有趣的例子。 例如, Future<T>是由另一个线程执行的asynchronous操作的结果的持有者。 Future.get将返回( T型的)操作值,并将阻塞,直到执行计算。

但是……如果没有什么可以回来的话呢? 简单:使用Future<Void> 。 例如,在Google App Engine中,asynchronous数据存储服务delete操作会返回未来. When . When is invoked on that future, get()时is invoked on that future,在删除完成返回null。 可以用Callable s写一个类似的例子。

另一个用例是没有值的Map ,即一个Map<T,Void> 。 这样的映射就像一个Set<T> ,那么当没有Set等价实现(例如,没有WeakHashSet ,那么可以使用WeakHashMap<T,Void> )时,它可能是有用的。

void是void的一个AutoBoxing特性(自JDK 1.5起)。

那么它自我解释说,虚空是参考,而虚无是一种原始的types。

那么,要求什么地方必须使用Void?

genericstypes的一个常见用法,我们不能使用原始types。

说,Android的AsyncTaks<Params, Progress, Result>如果我不想得到进展更新怎么办。 我不能在这里使用void(原始types),我们需要java.lang.Void

空格是有用的,因为有时你需要在方法本身之外指定方法的返回types。

例如,使用这个java 8 lambdaexpression式 ,它使用名为checkBenefitConcertInCentralPark的方法检查EventResource对象是否具有某些属性,并将其传递给方法checkCreatedEvent

 eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark); 

checkBenefitConcertInCentralPark方法是这样定义的(注意使用Void):

  public static Void checkBenefitConcertInCentralPark(EventResource eventResource) { // JUnit code here... // assertThat(blablabla :) ) return null; // we can only return null at the end of a method when returning Void } 

然后将checkBenefitConcertInCentralPark方法传递给checkBenefitConcertInCentralPark方法。

  // Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method public void checkCreatedEvent(Function<EventResource, Void> function) { function.apply(this.eventResource); } 

另一个使用Void例子是SwingWorker

 new SwingWorker<Void, Integer> () { @Override protected Void doInBackground(){ ... } @Override protected void process(List<Integer> chunk){ ... } @Override public void done(){ ... } }.execute();