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

时间:2012-05-31 18:18:41

标签: java void

在API中

  

“Void类是一个不可实例化的占位符类来容纳一个   引用表示Java关键字void的Class对象。“

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

6 个答案:

答案 0 :(得分:93)

java.lang.Void类似于java.lang.IntegerInteger是一种装箱原型int的值的方法。 Void是一种装箱原型void的值的方法。

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

右键!这就是java.lang.Void“不可实现”的原因。 :)

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

“那么java.lang.Voidvoid之间有什么区别?”

易。 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);
    }