我正在为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
?
泛型只处理对象类。泛型不支持void和原始类型,您不能将它们用作参数化类型。你必须使用Void。
你能说为什么你不想使用Void
?
Void
类型是针对这种情况创建的:创建一个具有泛型返回类型的方法,其中子类型可以是“void”。 Void
的设计方式使得不可能创建该类型的对象。因此,Void
类型的方法将始终返回null
(或完全异常),这与您将获得的几乎没有任何关系。你必须把return null
放在方法中,但这只会是一个小小的不便。
简而言之:请使用Void
。
当你需要返回java.lang.Void
时,只需返回null
。
唉,这是不可能的。您可以设置代码以返回Void
,但是您永远不能实现Void
,因此您实际上无法编写符合此规范的函数。
可以把它想象成:泛型函数说“这个函数返回X类型的东西”,你可以指定X但是你不能将句子改为“this function return nothing”。 (我不确定我是否同意这些语义,但这就是它们的方式。)
在这种情况下,我总是做的,只是使函数返回类型Object
,实际上总是返回null
。
你不能在泛型中使用原语,以便int
实际上是integer
。对象Void
类似于关键字void
用于泛型。
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() {}
}