Javagenericsvoid / Voidtypes

我正在为Apache HttpClient包实现ResponseHandler ,如下所示:

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

但我想为handleResponse函数返回什么,即void 。 这可能吗? 以下不编译,因为void不是一个有效的Javatypes:

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

我想我可以用voidreplacevoid来返回一个Void对象,但是这不是我想要的。 :是否有可能组织这种callback情况,使我可以返回void handleResponse

generics只处理对象类。 无效和原始types不被generics支持,并且不能将这些用作参数化types。 你必须改用Void。

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

Voidtypes是为了这个确切的情况而创build的:创build一个带有generics返回types的方法,其中子types可以是“void”。 Voiddevise方式是不能创build这种types的对象。 因此,一个types为Void的方法将总是返回null (或者exception完成),这与您将要获得的内容几乎没有任何关系。 你必须在方法中return null ,但这只是一个小小的不便。

总之:使用Void

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

唉,这是不可能的。 你可以设置代码返回Void ,但是你永远不能实例化一个Void所以你不能写一个符合这个规范的函数。

把它想象为:generics函数说“这个函数返回Xtypes的东西”,你可以指定X,但是你不能把句子改成“这个函数什么都不返回”。 (我不确定是否同意这些语义,但这是他们的方式。)

在这种情况下,我总是这样做,只是使函数返回typesObject ,实际上总是返回null

generics中不能有原语,所以int实际上是一个integer 。 对象Void与generics的关键字void类似。

Java中的这种java.lang.Void实现有其自身的意义。 另外,我写了一篇文章,把它和generics联系起来。 在开始理解这个之前,我花了一些心思: 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() {} }