72

在 API

“Void 类是一个不可实例化的占位符类,用于保存对表示 Java 关键字 void 的 Class 对象的引用。”

  1. 什么是“不可实例化”的占位符类?什么时候java.lang.Void使用?如果类是“不可实例化的”,它有什么用?
  2. java.lang.Void和有什么区别void
4

6 回答 6

105

java.lang.Void类似于java.lang.IntegerInteger是一种对原始类型值进行装箱的方法intVoid是一种对原始类型值进行装箱的方法void

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

正确的!这就是java.lang.Void“不可实例化”的原因。:)

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

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

简单的。void是原始类型。Void是继承自 的引用类型Object。它们的相似之处在于它们都没有任何可能的值。但是,从类型系统的角度来看,它们是两种截然不同的类型。

“但我在我的程序中没有任何用处Void。”

我对我的使用没有任何用处GarbageCollectorMXBean有些功能没有非晦涩的用途。没关系。

于 2012-09-27T22:00:48.767 回答
66

最常见的用途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>)。

于 2013-03-15T05:20:14.030 回答
57

唯一的一点就是握住VoidVoid.TYPE有点像void.class。如果你有一个对返回的方法的反射引用void,并且你得到了它的返回类型,它就会返回Void.TYPE

您不能也不应该将其用于其他任何事情。

于 2012-05-31T18:19:53.823 回答
5

Void 是 void 的一个自动装箱功能(从 JDK 1.5 开始)。

好吧,它的自我解释是 Void 是引用,而 void 是原始类型。

那么,哪里有要求必须使用 Void ???

泛型类型的一种常见用法,我们不能使用原始类型。

比如说,如果是 Android AsyncTaks<Params, Progress, Result>,如果我不想获得进度更新怎么办。我不能在这里使用 void (原始类型) 我们需要 java.lang.Void

于 2014-10-19T16:05:40.150 回答
2

另一个使用示例VoidSwingWorker

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();
于 2016-08-31T04:18:36.030 回答
1

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);
    }
于 2016-05-23T10:47:20.147 回答