【问题标题】: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 类的一般用途是什么?

【问题讨论】:

    标签: java generics 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 是要走的路。

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2014-05-31
      • 2012-02-20
      • 1970-01-01
      相关资源
      最近更新 更多