Java泛型void / Void类型

问题描述 投票:62回答:6

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

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

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

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

我想我可以用void替换Void来返回一个Void对象,但这不是我想要的。问题:是否有可能以这样一种方式组织这种回调情况,即我可以从void返回handleResponse

java void return-type
6个回答
49
投票

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

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


76
投票

Void类型是针对这种情况创建的:创建一个具有泛型返回类型的方法,其中子类型可以是“void”。 Void的设计方式使得不可能创建该类型的对象。因此,Void类型的方法将始终返回null(或完全异常),这与您将获得的几乎没有任何关系。你必须把return null放在方法中,但这只会是一个小小的不便。

简而言之:请使用Void


4
投票

当你需要返回java.lang.Void时,只需返回null


1
投票

唉,这是不可能的。您可以设置代码以返回Void,但是您永远不能实现Void,因此您实际上无法编写符合此规范的函数。

可以把它想象成:泛型函数说“这个函数返回X类型的东西”,你可以指定X但是你不能将句子改为“this function return nothing”。 (我不确定我是否同意这些语义,但这就是它们的方式。)

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


1
投票

你不能在泛型中使用原语,以便int实际上是integer。对象Void类似于关键字void用于泛型。


-1
投票

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() {}
}
© www.soinside.com 2019 - 2024. All rights reserved.