gpt4 book ai didi

java - 确定表达式的结果类

转载 作者:行者123 更新时间:2023-12-01 22:25:41 25 4
gpt4 key购买 nike

是否有一种简单的方法来确定 Java 数学表达式的结果 Java 类?例如,我可以计算诸如 String + double 之类的结果类,但是是否有什么东西可以在运行时给出混合类的任何有效表达式的结果类?

背景:我需要这个,因为我使用 Java 反射在运行时调用带有参数的方法。参数已从文本解析为 Expression 对象,其中 Expression 是我用于处理表达式的类。一个表达式可以由其他表达式组成。例如,我可能会解析如下代码:

double c = 2.2;
double d = 3.3;
long e = 4;
int f = 1000;
double a = 0;
double b = 0;
MyObject object = new MyObject();
object.getSomething(a, b, (c+d+e)/f);

我知道 a 和 b 的类,因为它们是定义的变量,但在我可以执行以下操作之前需要计算第三个参数的类:

Method method = MyObject.class.getMethod("getSomething", double.class, double.class, ????);

最佳答案

首先,您无法知道 ab,因为 ab 不是对象。它们是原始类型 double 的局部变量。在java中,有两种基本类型:原始类型( booleanbytecharshortintlongfloatdouble ,也许还有 void )和类类型。然而,还有一种称为自动装箱(和自动拆箱)的机制,可以在必要时在基本类型及其相应的“基本包装类”( BooleanByteCharacterShortIntegerLongFloatDouble )。您可以使用此自动转换来确定表达式的类型。示例:

byte a= 10 ;
float b= 16.3 ;
int c= 34 ;
Object o= a * b + c ;
o.getClass(); // Should be Double or one of the primitive wrapper classes in the general case
// You can easily convert this to double.class through an if/elseif sequence
// or a Map.

注意事项:当混合原始类型和包装类的变量(和/或参数和/或返回值)时,很容易丢失类型。特别是,Java 反射 API 大部分(如果不是专门)与包装类一起工作。这意味着,例如,方法 invoke 仅支持类类型的参数,并且由于自动装箱,Java 会将任何基本类型转换为包装对象,即使目标方法确实需要该基本类型(在这种情况下,将会有一个内部转换回来)到反射调用之前的原始类型)。作为一个很好的实验,如果您的编译器或 IDE 支持,请尝试关闭自动装箱/拆箱。如果不是这样,请将它们配置为在自动装箱/拆箱时产生警告。

现在,如果您的数值以多态方式表示(如字符串、对象或类似方式),那么您将需要为操作的结果类型定义自己的规则(或按照 Java 语言本身对它们进行建模) )并相应实现。这是因为 Java 自动装箱/拆箱是一种静态机制。

关于java - 确定表达式的结果类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28820864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com