killme2008 / aviatorscript

A high performance scripting language hosted on the JVM.
http://fnil.net/aviator/
4.66k stars 853 forks source link

解决Reflector中的paramArgTypeMatch匹配类型自动向上提升 #638

Open SingleWangErXiao opened 4 months ago

SingleWangErXiao commented 4 months ago

在aviator脚本中使用Math.round()函数遇到了下面的问题:

  1. 如果输入的参数是一个整数,执行就会抛出:IllegalArgumentException;
  2. 如果输入的参数是Double.MAX_VALUE,计算的结果会丢失精度。

查看源码Reflector#paramArgTypeMatch,发现传入的是一个整数那么就无法匹配到Math.round(),传入的是一个Double类型的数值,始终匹配到是Math.round(float a),这里可能会造成精度丢失。

我按照基本数据类型自动向上提升的原则,尝试修改了Reflector#paramArgTypeMatch的匹配规则,经过测试发现能达到预期的效果。

希望作者能够帮忙看看,我这种调整会引入其他的问题和潜在的风险点吗?

killme2008 commented 4 months ago

我想这里主要问题可能是性能上的影响,多了很多判断。

如果你明确需要类型,其实是可以加上类型转换函数的,比如

Math.round(double(a));