在Java中,如何获取所有可能的返回类型?

在Java中,如何获取所有可能的返回类型?,java,methods,reflection,types,return,Java,Methods,Reflection,Types,Return,在Java中,方法可以定义如下: Object m(boolean b) { if (b) { return "123"; } else { return new Integer(123); } } 在这种情况下,m的返回值在运行时可以是字符串或整数。那么,有没有任何方法可以在静态时间内获取一个方法的所有可能的运行时返回类型呢?对于这个特定的方法,是的。只需使用true和false调用它,并使用getClass()检查返回值。一般情况下,

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

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

在这种情况下,m的返回值在运行时可以是字符串或整数。那么,有没有任何方法可以在静态时间内获取一个方法的所有可能的运行时返回类型呢?

对于这个特定的方法,是的。只需使用
true
false
调用它,并使用
getClass()
检查返回值。一般情况下,没有

一般来说,你也不需要这样做。由于Java强大的类型和泛型,返回值的类型永远不会让人感到意外


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

对于此特定方法,是的。只需使用
true
false
调用它,并使用
getClass()
检查返回值。一般情况下,没有

一般来说,你也不需要这样做。由于Java强大的类型和泛型,返回值的类型永远不会让人感到意外


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

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


但是,以编程方式?对于任何方法,一般来说?不,你不能这样做,运行时不能。这就是为什么用有意义的返回类型编写好的、感性的方法签名非常重要的原因。返回
对象
很少是最好的主意。当你说你的方法返回
对象
时,这个方法的契约就是允许任何东西从中产生。这没什么错,但如果你只知道一个方法的签名,那就是你能说的最具体的一件事了。

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


但是,以编程方式?对于任何方法,一般来说?不,你不能这样做,运行时不能。这就是为什么用有意义的返回类型编写好的、感性的方法签名非常重要的原因。返回
对象
很少是最好的主意。当你说你的方法返回
对象
时,这个方法的契约就是允许任何东西从中产生。这没什么错,但如果你只知道一个方法的签名,那么这是你能说的最具体的一件事。

这被称为“糟糕的设计”。一些评论认为my day Hahaha方法应该有一个Javadoc和一个描述返回值的
@return
块标记。如果作者没有记录他们的方法,他们会感到羞耻(和糟糕的做法)。这被称为“糟糕的设计”。一些这样的评论让my day Hahaha方法应该有一个带有描述返回值的
@return
块标记的Javadoc。如果作者没有记录他们的方法,他们会感到羞耻(和糟糕的做法)。是的,我指的是一般情况。有任何静态分析工具可以做到这一点吗?@jitron没有。看@jitron你要找的是一个非常奇怪的要求。您的代码库中是否有很多方法具有
Object
返回类型和不同数量的实际返回对象类型?@jitron您不应该关心实际类型。这就是接口编程的全部内容。为什么你认为你需要追踪不同的类型?顺便说一下,你的例子很差。返回
字符串
整数
的方法无法通过任何代码检查。@jitron我认为您应该专注于这些其他方面。对于相似性的度量,这似乎是一个糟糕的选择,而且不可靠。是的,我指的是一般情况。有任何静态分析工具可以做到这一点吗?@jitron没有。看@jitron你要找的是一个非常奇怪的要求。您的代码库中是否有很多方法具有
Object
返回类型和不同数量的实际返回对象类型?@jitron您不应该关心实际类型。这就是接口编程的全部内容。为什么你认为你需要追踪不同的类型?顺便说一下,你的例子很差。返回
字符串
整数
的方法无法通过任何代码检查。@jitron我认为您应该专注于这些其他方面。对于相似性的度量,这似乎是一个糟糕的选择,而且不可靠。