如果方法的返回类型是 Void,我应该返回啥? (不是无效的!)

Posted

技术标签:

【中文标题】如果方法的返回类型是 Void,我应该返回啥? (不是无效的!)【英文标题】:What do I return if the return type of a method is Void? (Not void!)如果方法的返回类型是 Void,我应该返回什么? (不是无效的!) 【发布时间】:2010-10-15 04:03:09 【问题描述】:

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

public Void doSomething() 
    //...

并且编译器要求我返回 something。现在我只是返回null,但我想知道这是否是一种好的编码习惯......

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

我也试过Void.classvoidVoid.TYPEnew Void(),完全没有回报,但所有这些都不起作用。 (出于或多或少显而易见的原因)(详见this answer)

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

【问题讨论】:

【参考方案1】:

就这样。

public Class TestClass 
    public void testMethod () 
        return;
    

【讨论】:

OP 说的是Void,而不是void。其他答案似乎已经很好地涵盖了这个主题。【参考方案2】:

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

使用return nullVoid 不能被实例化,它只是 Class<T> 类型的 void 的占位符。

Void 有什么意义?

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

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

如果您需要实现具有此签名的方法,我会说您的 API 可能有些古怪。仔细考虑是否有更好的方法来做你想做的事(也许你可以在不同的后续问题中提供更多细节?)。我有点怀疑,因为这只是“由于使用泛型”而出现的。

【讨论】:

不得不返回 Void 并不是那么时髦。它可以简单地由例如可调用。有时您只是不需要返回某些东西但不能使用例如可运行。 Void 有合法用途,正如我所指出的。但他说“这只是由于使用了仿制药”。这听起来像是他对需要使用 Void 的集合做了一些事情,我会说这是一个相当特殊的情况。 如果有收藏,确实会很奇怪。 Void.class 和 void.class 都是 Class 但它们不相等。 Void 通常用作 Map 的值(或使用 Collections.newSetFromMap)和 AccessController.doPrivileged 的​​返回值中的通用参数。 @Tom:是的。这就是为什么我标记了“(从技术上讲,你会回到 Class。)”我应该修改那部分还是你认为它是准确的?【参考方案3】:

要弄清楚为什么您提供的其他建议不起作用:

Void.classVoid.TYPE 指向同一个对象,并且是 Class<Void> 类型,而不是 Void

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

希望这会有所帮助! :-)

【讨论】:

小修正:Void.TYPE 不指向Void.class。它指向void.class【参考方案4】:

没有办法实例化 Void,所以您可以返回的唯一内容是 null。

【讨论】:

更准确地说,没有做坏事就没有办法实例化一个虚空。【参考方案5】:

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

【讨论】:

我不是必须的;这只是惯例。【参考方案6】:

return null 是要走的路。

【讨论】:

以上是关于如果方法的返回类型是 Void,我应该返回啥? (不是无效的!)的主要内容,如果未能解决你的问题,请参考以下文章

String 的compare比较方法返回值有啥含义

java方法通过啥关键字返回结果,如果方法没有返回值,则使用啥关键字作为?

C语言中void main和int main有啥区别

void是啥意思,oop又是啥意思?

请问函数的返回值类型那里,写“类名”和“类名&”有啥区别?

有没有办法在 int 类型方法中返回 void