【问题标题】:Java generics void/Void typesJava 泛型 void/Void 类型
【发布时间】:2023-03-16 12:30:01
【问题描述】:

我正在为 apache HttpClient 包实现ResponseHandler,如下所示:

new ResponseHandler<int>() {
    public int handleResponse(...) {
        // ... code ...
        return 0;
    }
}

但我希望 handleResponse 函数不返回任何内容,即 void。这可能吗?以下内容无法编译,因为 void 不是有效的 Java 类型:

new ResponseHandler<void>() {
        public void handleResponse(...) {
            // ... code ...
        }
}

我想我可以用Void 替换void 以返回Void 对象,但这并不是我真正想要的。 问题:是否有可能组织这种回调情况,使我可以从handleResponse 返回void

【问题讨论】:

    标签: java void return-type


    【解决方案1】:

    Void 类型是针对这种确切情况创建的:创建具有通用返回类型的方法,其中子类型可以是“void”。 Void 的设计方式是不可能创建该类型的对象。因此Void 类型的方法将始终返回null(或异常完成),这与您将得到的几乎没有任何关系。您必须在方法中输入return null,但这应该只是轻微的不便。

    简而言之:请使用Void

    【讨论】:

    • Arrgh - 泛型的痛苦问题在于,如果假设您定义了“Void”的返回类型,则必须放入“return(null);”声明 void 的返回类型的主要原因是您不必有 return 语句,并且可以使用现有的“void”方法:) Java 泛型的部分问题是运行时类型检查的混为一谈需要编译时代码生成和“簿记”帮助。人们需要“宏”和“模板”,以便在语言方面编写代码。
    • +1 澄清一下,Void 自 JDK1.1 以来一直存在。它最初是为与反射一起使用而创建的,但在泛型中具有类似的作用。
    • @ILMTitan 您能否提供有关定义为返回 Void 的方法中的“return null”语句的文档的参考?
    • @andriy-simonov 返回类型为void 的方法不必返回值。返回类型为Object 或任何子类(例如Void)的方法必须返回一个值(或不能正常完成)。可以分配给Void 并因此从Void 方法返回的唯一值是null
    【解决方案2】:

    泛型只处理对象类。泛型不支持 void 和原始类型,您不能将它们用作参数化类型。您必须改用 Void。

    你能说说你为什么不想使用Void吗?

    【讨论】:

    • 我只是不想在我不返回任何内容的函数中包含 return 语句,主要是为了清洁。
    • 您可以创建一个抽象包装器,调用您的void 方法并返回null 以隐藏这种丑陋。
    • +1 提醒我“计算机科学中的任何问题都可以通过添加间接层来解决”
    • @TravisWebb 看看你的具体需求,根本不要使用泛型,如果可以的话,返回 Object 类型
    【解决方案3】:

    当您需要返回java.lang.Void时,只需返回null即可。

    【讨论】:

      【解决方案4】:

      在泛型中不能有原语,所以int 实际上是Integer。对象Void 类似于泛型关键字void

      【讨论】:

      • void 不是原语,它只是一个 java 关键字。它没有“类型”
      • 它肯定不是同义词! void(小写) - 关键字,没有返回; Void(大写)- 一个(不可实例化的),该类的实例被返回(只能是null,因为不可实例化)
      • @Carlos Heuberger 类似的东西对你来说更好吗?
      【解决方案5】:

      唉,这是不可能的。您可以将代码设置为按您所说的返回Void,但是您永远无法实例化Void,因此您实际上无法编写符合以下条件的函数本规范。

      可以把它想象成:泛型函数说“这个函数返回了 X 类型的东西”,您可以指定 X,但不能将句子更改为“这个函数什么也不返回”。 (我不确定我是否同意这些语义,但它们就是这样。)

      在这种情况下,我总是做的只是让函数返回类型Object,实际上总是返回null

      【讨论】:

      • 因为返回类型是 Object,编译器不能保证只返回 null。扩展托马斯的答案,试试这些:static Void v() { return null; } static Void n() { return "NotAllowed"; } static Object o() { return "Allowed"; }
      【解决方案6】:

      Java 中的这种 java.lang.Void 实现不言自明。另外,我写了一篇将其与泛型联系起来的文章。在我开始理解这一点之前,我花了一些心思: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() {}
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多