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 ... } }
我想我可以用void
replacevoid
来返回一个Void
对象,但是这不是我想要的。 问 :是否有可能组织这种callback情况,使我可以返回void
handleResponse
?
generics只处理对象类。 无效和原始types不被generics支持,并且不能将这些用作参数化types。 你必须改用Void。
你能说为什么你不想使用Void
?
Void
types是为了这个确切的情况而创build的:创build一个带有generics返回types的方法,其中子types可以是“void”。 Void
devise方式是不能创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() {} }