java.lang.Void和void有什么区别?
在API中
“Void类是一个不合理的占位符类,用于保存对表示Java关键字void的Class对象的引用。
- 什么是“不合理”的持有人类? 什么时候会使用
java.lang.Void
? 如果这个class是“不合理的”,那有什么用呢? -
java.lang.Void
和void
什么区别?
Void
的唯一一点是保持Void.TYPE
,就像void.class
。 如果你有一个返回void
的方法的reflection引用,并且你得到它的返回types,它将返回Void.TYPE
。
你不能,也不应该把它用于其他任何事情。
java.lang.Void
类似于java.lang.Integer
。 Integer
是一种对原始typesint
进行装箱的方法。 Void
是一种对原始typesvoid
进行装箱的方法。
“但是等等, void
没有任何可能的价值!”
对! 这就是使java.lang.Void
“不合理”的原因。 🙂
Javatypes系统的一个很好的特性是每个原始types都有一个盒装的等价物。 int
有Integer
, long
有Long
, byte
有Byte
…, void
有Void
。 如果Void
不存在,这将是奇怪的和不对称的。
“那么java.lang.Void
和void
之间有什么区别呢?
简单。 void
是一个原始types。 Void
是从Object
inheritance的引用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();