如果一个方法的返回类型是Void,那么我应该返回什么?(注意不是小写的void!)

119

由于在Java中使用了泛型,我最终不得不实现一个返回类型为Void的函数:

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

编译器要求我返回一些东西。目前我只是返回null,但我想知道这是否是良好的编程实践...

我在问关于Void,不是void。是Void类,而不是保留关键字void

我也尝试了Void.classvoidVoid.TYPEnew Void(),甚至不返回,但都完全行不通(出于更或少明显的原因)。 (有关详细信息,请参见此答案

  • 那么当函数的返回类型为Void时,我应该返回什么?
  • Void类的一般用途是什么?
6个回答

107

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

使用return nullVoid无法实例化,只是voidClass<T>类型的占位符。

Void有什么用?

如上所述,它是一个占位符。Void是您将在返回类型为void的方法上使用反射查看时得到的内容。(从技术上讲,您会得到Class<Void>。) 它还有其他各种用途,例如如果要将Callable<T>参数化。

由于Java中使用了泛型,我最终不得不实现这个函数

如果您需要实现具有此签名的方法,则可能API存在问题。仔细考虑是否有更好的方法来完成您想要的操作(也许您可以在另一个后续问题中提供更多细节?)。我有点怀疑,因为这只是因为“使用了泛型”才出现这种情况。


13
不得不返回Void并不那么奇怪。例如,可以通过Callable<T>强制执行这种情况。有时候你只是不需要返回任何东西,但不能使用例如Runnable的方法。 - Bombe
Void有合法的用途,正如我所指出的。但他说,“这只是由于使用泛型而出现的”。这使得它听起来像是他对需要使用Void的集合做了某些特殊处理,我认为这是一个相当特殊的情况。 - John Feminella
使用集合,这将非常奇怪。 - Bombe
Void.class和void.class都是Class<Void>,但它们并不相等。在Map的值(或使用Collections.newSetFromMap)和AccessController.doPrivileged的返回中,Void通常用作泛型参数。 - Tom Hawtin - tackline
嗯,它们并不是完全相同的东西。“return;”根本没有返回任何内容。但是,Class<Void>仍然是一个对象,即使它不能被实例化。 - John Feminella
显示剩余2条评论

27

无法创建 Void 实例,因此您唯一能返回的是 null。


14
更准确地说,没有办法实例化一个Void而不进行邪恶的操作。 - Michael Myers

21

return null 是正确的做法。


21
为了说明为什么您给出的其他建议不起作用: Void.classVoid.TYPE指向同一个对象,类型为Class<Void>,而不是Void
这就是为什么您无法返回这些值。 new Void()将是类型为Void的对象,但该构造函数不存在。实际上,Void没有公共构造函数,因此无法实例化:除了多态的null之外,您永远不可能拥有任何类型为Void的对象。
希望能对您有所帮助! :-)

2
小修正:Void.TYPE 不指向 Void.class,而是指向 void.class - shmosel

1

如果出于某些不明原因,您必须使用此类型,则似乎返回null是一个明智的选择,因为我认为返回值将不会被使用。
无论如何,编译器都会强制您返回一些内容。
而且这个类似乎没有公共构造函数,所以new Void()不可能。


这并不是必须的,只是一种惯例。 - Tom Hawtin - tackline

-4

就像这样。

public Class TestClass {
    public void testMethod () {
        return;
    }
}

2
OP说的是Void,而不是void。其他答案已经基本覆盖了该主题。 - E net4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接