在 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 . Whenget() 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);
}