如果方法的返回类型为Void,我该返回什么?(不无效!)


115

由于在Java中使用了泛型,我最终不得不实现具有Voidas返回类型的函数:

public Void doSomething() {
    //...
}

并且编译器要求我返回一些东西。现在我只是返回null,但是我想知道这是否是一种好的编码实践……

我问的是V oid,而不是V oid。类Void不是保留关键字void

我也试过Void.classvoidVoid.TYPEnew Void(),没有回报可言,但都不会在所有的工作。(出于或多或少明显的原因)(有关详细信息,请参见此答案

  • 那么,如果函数的返回类型为,我应该返回Void什么呢?
  • Void课程的一般用途是什么?

Answers:


104

那如果函数的返回类型必须是我应该返回Void什么呢?

使用return nullVoid无法实例化,仅是的Class<T>类型的占位符void

有什么意义Void

如上所述,它是一个占位符。Void例如,如果您使用反射来查看返回类型为的方法,那么您将得到什么void。(从技术上讲,您会回来的Class<Void>。)沿着这些思路,它还有其他多种用途,例如,如果您想参数化一个Callable<T>

由于在Java中使用了泛型,我最终不得不实现此功能

我想说的是,如果您需要使用此签名实现方法,则API可能有些奇怪。请仔细考虑是否有更好的方法来完成您想要的事情(也许您可以在其他后续问题中提供更多详细信息?)。我有点怀疑,因为这只是“由于使用泛型”而引起的。


13
毕竟,必须返回Void并不那么时髦。它可以简单地由例如Callable <T>来强制执行。有时,您只是不需要返回某些内容,而不能使用例如Runnable。
孟买

正如我指出的,虚空具有合法用途。但是他说“这仅仅是由于使用了泛型”。听起来好像他对需要使用Void的集合做了一些操作,我认为这是一个非常特殊的情况。
约翰·费米内拉

确实,有了收藏,这将是非常奇怪的。
孟买2009年

Void.class和void.class都是Class <Void>,但它们不相等。Void通常用作Map值(或使用Collections.newSetFromMap)和AccessController.doPrivileged返回的通用参数。
Tom Hawtin-抢险活动

@汤姆:是的。这就是为什么我标记了“(从技术上来说,您会得到Class <Void>的。)”我应该修改该部分还是您认为它是正确的?
约翰·费米内拉



20

为了弄清楚为什么您给出的其他建议不起作用:

Void.classVoid.TYPE指向相同的对象,并且是类型的Class<Void>,不是类型的Void

这就是为什么您不能返回这些值的原因。new Void()会是类型,Void但该构造函数不存在。实际上,Void没有公共构造函数,因此无法实例化:Void除polymorphic之外,您永远不能有任何类型的对象null

希望这可以帮助!:-)


1
较小的更正:Void.TYPE不指向Void.class。它指向void.class
shmosel 2015年

1

如果出于晦涩的原因,您必须使用此类型,那么实际上返回null似乎是一个明智的选择,因为我想无论如何都不会使用返回值。
编译器将强制您返回任何内容。
而且该类似乎没有公共构造函数,因此不可能使用新的Void()。


我不会是必须的;这只是约定。
Tom Hawtin-抢险活动

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.