【问题标题】:In Java, how to get all possible return types?在 Java 中,如何获取所有可能的返回类型?
【发布时间】:2017-01-18 01:07:09
【问题描述】:

在Java中,方法可以定义如下:

Object m(boolean b) {
    if (b) {
        return "123";
    } else {
        return new Integer(123);
    }
}

在这种情况下,m 的返回值在运行时可以是 String 或 Integer。那么有没有办法在静态时间内获取方法的所有可能的运行时返回类型?

【问题讨论】:

  • 这被称为“糟糕的设计”。
  • 一些 SO cmets 让我很开心哈哈哈
  • 一个方法应该有一个带有@return块标签的Javadoc来描述返回值。如果作者没有记录他们的方法,那就对他们感到羞耻(和不好的做法)。

标签: java methods reflection types return


【解决方案1】:

对于这种特殊的方法,是的。只需用truefalse 调用它,然后用getClass() 检查返回值。对于一般情况,没有。

通常您也不需要。由于 Java 的强类型和泛型,返回值的类型永远不会是一个巨大的惊喜。

应避免返回示例中所示的多种不同类型,并且在有用/必要的情况下(例如工厂模式),它应该与调用者无关。

【讨论】:

  • 是的,我的意思是一般情况。有没有静态分析工具可以做到这一点?
  • @jitron 您正在寻找的是一个非常奇怪的要求。您的代码库是否有很多方法具有 Object 返回类型和不同数量的实际返回对象类型?
  • @jitron 你不应该关心实际的类型。这就是接口编程的全部意义所在。为什么你认为你需要跟踪不同的类型?顺便说一句,你的例子很差。返回 StringInteger 的方法不会通过任何代码审查。
  • @jitron 我认为您应该专注于其他方面。这似乎是衡量相似性的糟糕选择,而且不可靠。
【解决方案2】:

如果你知道方法的实现,是的。您知道它可以返回的所有类型,因为您可以阅读代码并自己告诉自己它们是什么。

但是,以编程方式?一般来说,对于任何方法?不,你不能这样做,不是在运行时。这就是为什么用有意义的返回类型编写好的、有意义的方法签名是非常重要的。返回Object 很少是最好的主意。当您说您的方法返回Object 时,该方法的约定是实际上任何东西 都可以从中产生。这并没有错,但如果你只知道它的签名,那是你可以说的关于方法的最具体的事情。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多