在 API
“Void 类是一个不可实例化的占位符类,用于保存对表示 Java 关键字 void 的 Class 对象的引用。”
- 什么是“不可实例化”的占位符类?什么时候
java.lang.Void
使用?如果类是“不可实例化的”,它有什么用? java.lang.Void
和有什么区别void
?
java.lang.Void
类似于java.lang.Integer
。Integer
是一种对原始类型值进行装箱的方法int
。Void
是一种对原始类型值进行装箱的方法void
。
“但是等等,void
没有任何可能的值!”
正确的!这就是java.lang.Void
“不可实例化”的原因。:)
Java 类型系统的一个很好的特性是每个原始类型都有一个盒装的等价物。int
有Integer
,long
有Long
,byte
有Byte
……而且void
有Void
。如果Void
不存在,那将是奇怪和不对称的。
java.lang.Void
“那么和有什么区别void
?”
简单的。void
是原始类型。Void
是继承自 的引用类型Object
。它们的相似之处在于它们都没有任何可能的值。但是,从类型系统的角度来看,它们是两种截然不同的类型。
“但我在我的程序中没有任何用处Void
。”
我对我的使用没有任何用处GarbageCollectorMXBean
。有些功能没有非晦涩的用途。没关系。
最常见的用途Void
是反射,但这不是唯一可以使用它的地方。
void
是一个关键字,表示函数不会产生值。
java.lang.Void
是引用类型,则以下内容有效:
Void nil = null;
(到目前为止,它并不有趣......)
作为结果类型(返回值类型Void
为 的函数),它意味着函数 *always * 返回null
(它不能返回除 之外的任何内容null
,因为Void
没有实例)。
Void function(int a, int b) {
//do something
return null;
}
为什么我想要一个总是返回 null 的函数?
在泛型发明之前,我没有Void
.
对于泛型,有一些有趣的案例。例如,aFuture<T>
是另一个线程执行的异步操作结果的持有者。Future.get
将返回操作值(类型T
),并阻塞直到执行计算。
但是......如果没有什么可以返回怎么办?很简单:使用Future<Void>
. 例如,在 Google App Engine 中,异步数据存储服务delete
操作返回一个 future . When
get() is invoked on that future,
null` ,在删除完成后返回。可以用Callable写一个类似的例子。
另一个用例是 aMap
没有值,即 a Map<T,Void>
。这样的映射表现得像 a Set<T>
,那么当没有等效的实现时它可能很有用Set
(例如,没有WeakHashSet
,那么可以使用 a WeakHashMap<T,Void>
)。
唯一的一点就是握住Void
,Void.TYPE
有点像void.class
。如果你有一个对返回的方法的反射引用void
,并且你得到了它的返回类型,它就会返回Void.TYPE
。
您不能也不应该将其用于其他任何事情。
Void 是 void 的一个自动装箱功能(从 JDK 1.5 开始)。
好吧,它的自我解释是 Void 是引用,而 void 是原始类型。
那么,哪里有要求必须使用 Void ???
泛型类型的一种常见用法,我们不能使用原始类型。
比如说,如果是 Android
AsyncTaks<Params, Progress, Result>
,如果我不想获得进度更新怎么办。我不能在这里使用 void (原始类型) 我们需要 java.lang.Void
另一个使用示例Void
是SwingWorker
new SwingWorker<Void, Integer> () {
@Override
protected Void doInBackground(){
...
}
@Override
protected void process(List<Integer> chunk){
...
}
@Override
public void done(){
...
}
}.execute();
Void 很有用,因为有时您需要在方法本身之外指定方法的返回类型。
以这个java 8 lambda 表达式为例,它检查 EventResource 对象是否具有某些属性,使用名为 的方法checkBenefitConcertInCentralPark
,传递给方法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
方法传递给方法checkCreatedEvent
。
// Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
public void checkCreatedEvent(Function<EventResource, Void> function) {
function.apply(this.eventResource);
}