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

use*_*722 56 java void

在API中

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

  1. 什么是"不可解决的"占位符类?何时java.lang.Void使用?如果该类是"不可实现的",它有什么用?
  2. java.lang.Void和之间有什么区别void

Quu*_*one 97

java.lang.Void类似于java.lang.Integer.Integer是一种拳击原始类型值的方法int.Void是一种拳击原始类型值的方法void.

"但等等,void没有任何可能的价值!"

对!这就是java.lang.Void"无法实现"的原因.:)

这是Java类型系统的一个很好的特性,每个基本类型都有一个盒装等价物.intInteger,longLong,byteByte......和voidVoid.如果Void 存在,那将是奇怪的和不对称的.

"那么java.lang.Void和之间的区别是void什么?"

简单.void是一种原始类型.Void是继承自的引用类型Object.它们的相似之处在于它们都没有任何可能的价值; 但从类型系统的角度来看,它们是两种截然不同的类型.

"但我Void在我的课程中没有任何用处."

而我GarbageCollectorMXBean在我的用处并没有任何用处.有些功能不具有非晦涩的用途.没关系.

  • `void`是一个关键字但实际上不是`原始类型`,`Void.TYPE`用作`void`关键字的表示 (2认同)

Jav*_*ier 54

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

void 是一个关键字,表示函数不会产生值.

java.lang.Void 是一个引用类型,然后以下是有效的:

 Void nil = null;
Run Code Online (Sandbox Code Playgroud)

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

作为结果类型(具有类型的返回值Void的函数),这意味着函数*总是*返回null(它不能返回除了之外的任何内容null,因为Void没有实例).

 Void function(int a, int b) {
    //do something
    return null;
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

但是......如果没有任何回报怎么办?简单:用一个Future<Void>.例如,在Google App Engine中,Asyncronous Datastore Service delete操作. When会在删除完成返回将来的get()is invoked on that future,null` .人们可以用Callable s 写一个类似的例子.

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

  • +1 有关使用包含“Void”的“Map”来模拟“Set”的示例和见解。然而,“Void”的“WeakHashMap”并不是一个很好的例子,因为这样的构造并不比普通的“HashSet”更好(没有从“弱”功能中受益)。(有趣的是,“HashSet&lt;E&gt;”实际上是由“HashMap&lt;E,Object&gt;”支持的。) (2认同)

Lou*_*man 52

唯一的一点Void是持有Void.TYPE,这是有点像void.class.如果你有一个返回的方法的反射引用void,并且你得到它的返回类型,它将返回Void.TYPE.

你不能也不应该将它用于其他任何事情.

  • @LouisWasserman`Void`可以与某些使用泛型的类一起使用.例如`SwingWorker`.我指出这一点是因为你说它不能用于任何其他事情. (9认同)

Ami*_*dav 5

Void是一个AutoBoxing功能(自JDK 1.5起)的void.

它的自我解释是Void是参考,而void是原始类型.

那么,要求必须使用Void ???

Generic类型的一个常见用法,我们不能使用原语.

比方说,AsyncTaks<Params, Progress, Result>如果我不想获得Progress更新,那么Android会怎样.我不能在这里使用void(原始类型)我们需要java.lang.Void