2024年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多关于如何工作的信息。

0 投票
Clojure
关闭

问题
在进行 Java 调用(或内联函数)时,如果参数和参数都是原始参数,则不使用扩展转换来定位正确的重载方法/构造函数。

示例

`user=> (Integer. (byte 0))
java.lang.IllegalArgumentException: 没有找到类 java.lang.Integer 的匹配构造函数 (NO_SOURCE_FILE:0)

上述发生的错误是因为没有 Integer(byte) 构造函数,尽管它应该与 Integer(int) 匹配。

user=> (bit-shift-left (byte 1) 1)
Reflection warning, NO_SOURCE_PATH:3 - call to shiftLeft can't be resolved.
2` In the above, a call is made via reflection to Numbers.shiftLeft(Object, Object) and its associated auto-boxing, instead of directly to the perfectly adequate Numbers.shiftLeft(long, int). Workarounds:
Explicitly casting to the formal type. Ancillary benefits of fixing:
It would also reduce the amount of method overloading, e.g., RT.intCast(char), intCast(byte), intCast(short), could all be removed, since such calls would pass to RT.intCast(int).
结束注解: 作为 CLJ-2843 的副作用在 1.11.3 和 1.12.0-alpha10 中修复

26 答案

0 投票

评论者:redinger

这项工作现在太大,无法包含在 1.3 测试版中。我们将在未来的版本中重新审视。

0 投票

评论者:ataggart

为更好地理解更改,我已将其分为两个补丁,每个补丁都包含多个可隔离的增量提交。

reorg-reflector.patch: 将反射/调用代码从编译器移动到Reflector,消除了冗余代码。结果是一个用于解析方法和构造函数的单一代码库,这将允许在不进行过多外部协调的情况下更改该机制。 此版本没有任何行为变更。

prim-conversion.patch: 需依赖于上述修改。修改了方法/构造函数的解析过程
更符合Java解析,尤其是在调用1.5以前版本的APIs时
添加了对同一类别的基本数值类型进行扩展转换的支持(这比Java严格,且更类似于Clojure)
* 在编译时增加了对通配符匹配的支持(即,您不需要为每个参数提供类型提示来避免反射)。

这也为添加更多功能提供了基础,例如CLJ-666。

0 投票

评论者:ataggart

它已在原地进行了说明,以下是该反射器用于查找方法的转换规则

  1. 按类型
    **** 对象到祖先类型
    • 原始类型到相同数值类别的更宽原始类型(新添加)
  2. 装箱
    • 装箱后的数字转换为它的原始类型
    • 装箱后的数字转换为相同数值类别的较宽原始类型(针对Short和Byte参数的新特性)
      **** 原始类型转换为其装箱值
    • 原始类型转换为Number或Object(新特性)
  3. 强制类型转换
    • 将long转换为int
    • 将double转换为float
0 投票

评论者:ataggart

prim-conversion-update-1.patch应用于当前主分支。

0 投票

评论者:ataggart

为反射器的重组创建了CLJ-792。

0 投票

评论者:stuart.sierra

prim-conversion-update-1.patch自f5bcf64版本后不再适用。

CLJ-792现在是否是该ticket的先决条件?

0 投票

评论者:ataggart

是的,在原始补丁被认为“过大”之后。

在TPTB没有任何行动这么久之后,您可以随意关闭这两个工单。

0 投票
by

评论者:jafingerhut

再次,不确定这是否有任何帮助,但我已经从2012年2月20日Clojure的主分支开始测试,应用了附在CLJ-792上的clj-792-reorg-reflector-patch2.txt补丁,然后应用了附在这个工单上的clj-445-prim-conversion-update-2-patch.txt补丁,结果编译并通过了所有测试,除了两个测试之外。我不知道这些失败是否容易修复,或者这些补丁是否引入了问题。

0 投票
by

评论者:bronsa

截至1.7.0-alpha5,工单描述中的两个示例在没有异常/reflection-warnings的情况下运行

user=> (set! *warn-on-reflection* true) true user=> (bit-shift-left (byte 1) 1) 2 user=> (Integer. (byte 0)) 0

0 投票
by

评论者:fl00r

你好!

`
(Integer. (Long. 1))

=> 1

(Long. (Integer. 1))

=> 异常

`

https://github.com/clojure/clojure/pull/59

0 投票
by
参考:https://clojure.atlassian.net/browse/CLJ-445(由ataggart提交)
...