90

我正在ResponseHandler为 apache HttpClient 包实现一个,如下所示:

new ResponseHandler<int>() {
    public int handleResponse(...) {
        // ... code ...
        return 0;
    }
}

但我希望该handleResponse函数不返回任何内容,即void. 这可能吗?以下内容无法编译,因为void它不是有效的 Java 类型:

new ResponseHandler<void>() {
        public void handleResponse(...) {
            // ... code ...
        }
}

我想我可以替换voidVoid返回一个Void对象,但这并不是我真正想要的。问题void:是否可以以我可以返回的方式组织这种回调情况handleResponse

4

6 回答 6

98

Void类型是为这种确切情况创建的:创建一个具有通用返回类型的方法,其中子类型可以是“void”。Void被设计成不可能创建该类型的对象。因此,类型的方法Void将始终返回null(或异常完成),这与您将得到的几乎没有任何关系。您确实必须return null输入该方法,但这应该只是一个小的不便。

简而言之:使用Void.

于 2011-04-06T15:47:21.010 回答
71

泛型只处理对象类。泛型不支持 void 和原始类型,您不能将它们用作参数化类型。您必须改用 Void。

你能说你为什么不想使用Void吗?

于 2011-04-06T14:58:33.020 回答
12

当您需要返回时java.lang.Void,只需返回即可null

于 2017-01-04T19:59:01.387 回答
1

泛型中不能有原语,所以它int实际上是一个Integer. 该对象Void类似于void泛型的关键字。

于 2011-04-06T14:57:04.707 回答
0

唉,这是不可能的。您可以将代码设置为Void按您所说的返回,但是您永远不能实例化 a Void,因此您实际上无法编写符合本规范的函数。

把它想象成:泛型函数说“这个函数返回了 X 类型的东西”,你可以指定 X,但你不能把句子改成“这个函数什么都不返回”。(我不确定我是否同意这些语义,但它们就是这样。)

在这种情况下,我总是做的只是让函数返回类型Object,实际上总是返回null

于 2011-04-06T14:57:47.543 回答
0

Java 中的这种 java.lang.Void 实现不言自明。另外,我写了一篇将其与泛型联系起来的文章。在我开始理解这一点之前,我花了一些心思:http ://www.siteconsortium.com/h/D00006.php 。注意 TYPE = Class.getPrimitiveClass("void");

包java.lang;

public final class Void {

    public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

    private Void() {}
}
于 2013-12-27T18:08:19.250 回答