我正在为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
返回{{1}}来组织此回调情况?
答案 0 :(得分:76)
为此确切情况创建了Void
类型:创建一个具有泛型返回类型的方法,其中子类型可以是“void”。 Void
的设计方式使得不可能创建该类型的对象。因此,类型Void
的方法将始终返回null
(或异常完成),这与您将要获得的一样接近于零。你必须在方法中放置return null
,但这只会是一个小小的不便。
简而言之:请使用Void
。
答案 1 :(得分:49)
泛型只处理对象类。泛型不支持void和原始类型,您不能将它们用作参数化类型。你必须使用Void。
您能说出为什么不想使用Void
吗?
答案 2 :(得分:4)
当您需要返回php_value upload_max_filesize 100M
php_value post_max_size 100M
时,只需返回java.lang.Void
。
答案 3 :(得分:1)
您不能在泛型中使用原语,因此int
实际上是integer
。对象Void
类似于泛型的关键字void
。
答案 4 :(得分:1)
唉,这是不可能的。你可以设置代码返回Void
,但是你永远不能实现Void
,所以你实际上不能写一个符合本规范的功能。
将其视为:泛型函数说“此函数返回X类型的东西”,您可以指定X但不能将句子更改为“此函数不返回任何内容”。 (我不确定我是否同意这些语义,但这就是它们的方式。)
在这种情况下,我总是这样做,只是让函数返回类型Object
,实际上总是返回null
。
答案 5 :(得分:-1)
这种Java中的java.lang.Void实现说明了一切。另外,我写了一篇文章,将其与泛型联系起来。在我开始理解这个问题之前,我花了一些心思:http://www.siteconsortium.com/h/D00006.php。注意TYPE = Class.getPrimitiveClass(“void”);
package java.lang;
public final class Void {
public static final Class<Void> TYPE = Class.getPrimitiveClass("void");
private Void() {}
}