在API中
“Void类是一个不可实例化的占位符类来容纳一个 引用表示Java关键字void的Class对象。“
java.lang.Void
?如果该类是“不可实现的”,它有什么用?java.lang.Void
和void
之间有什么区别?答案 0 :(得分:93)
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
没有任何用处。某些功能没有非模糊用途。没关系。
答案 1 :(得分:49)
Void
的唯一点是保留Void.TYPE
,有点像void.class
。如果您对返回void
的方法有反射性引用,并且您获得了返回类型,那么它将返回Void.TYPE
。
你不能也不应该将它用于其他任何事情。
答案 2 :(得分:49)
Void
最常见的用途是反思,但这不是唯一可以使用的地方。
void
是一个关键字,表示函数不会产生值。
java.lang.Void
是引用类型,然后以下内容有效:
Void nil = null;
(到目前为止它并不有趣......)
作为结果类型(返回值类型为Void
的函数),表示函数*始终*返回null
(它不能返回null
以外的任何内容,因为Void
没有实例)。
Void function(int a, int b) {
//do something
return null;
}
为什么我喜欢总是返回null的函数?
在发明泛型之前,我没有Void
的用例。
使用泛型,有一些有趣的案例。例如,Future<T>
是由另一个线程执行的异步操作的结果的持有者。 Future.get
将返回操作值(类型T
),并将阻塞直到执行计算。
但是......如果没有什么可以回来怎么办?简单:使用Future<Void>
。例如,在Google App Engine中,Asyncronous数据存储区服务delete
操作返回将来. When
get()is invoked on that future,
null`在删除完成后返回。可以用Callable s写一个类似的例子。
另一个用例是没有值的Map
,即Map<T,Void>
。这样的地图的行为类似于Set<T>
,那么当没有Set
的等效实现时(例如,没有WeakHashSet
,它可能会有用),然后可以使用{{3} }})。
答案 3 :(得分:5)
Void是void的自动包装功能(自JDK 1.5起)。
它的自我解释是Void是参考,而void是a 原始类型。
那么,要求必须使用Void ???
通用类型的一种常见用法,我们无法使用原语。
如果是Android
AsyncTaks<Params, Progress, Result>
,请说如果我 不想获得进度更新。我不能使用void(原始类型) 这里我们需要java.lang.Void
答案 4 :(得分:2)
使用Void
的另一个示例是SwingWorker
new SwingWorker<Void, Integer> () {
@Override
protected Void doInBackground(){
...
}
@Override
protected void process(List<Integer> chunk){
...
}
@Override
public void done(){
...
}
}.execute();
答案 5 :(得分:1)
Void非常有用,因为有时您需要在方法本身之外指定方法的返回类型。
例如,使用此java 8 lambda expression,它使用名为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
方法传递给方法checkCreatedEvent
。
// Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
public void checkCreatedEvent(Function<EventResource, Void> function) {
function.apply(this.eventResource);
}