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 beta 版。我们将在未来版本中重新审视。

0

评论由:ataggart 发布

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

reorg-reflector.patch: 将反射/调用代码从编译器移至Reflector,并消除冗余代码。结果是单一代码库用于解析方法/构造函数,这将允许在不进行过多外部协调的情况下修改该机制。此修补程序不包含行为更改。

prim-conversion.patch: 依赖于上述修补程序。修改方法/构造函数解析过程。
更符合Java解析,尤其是在调用1.5之前的API时
添加了对同一类别的基本数字的宽化转换的支持(这比Java严格,更接近Clojure)
* 支持在编译时进行通配符匹配(即,您无需对每个参数进行类型提示即可避免反射)。

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

0
by

评论由:ataggart 发布

它已就地记录,但以下是用于找到方法的转换规则

  1. 按类型
    **** 对象到祖先类型
    • 原语到同一数值类型的更宽原语(新功能)
  2. 装箱
    • 装箱的数字到其基本原语
    • 装箱的数字到同一数值类型的更宽原语(针对Short和Byte参数的新功能)
      **** 原语到其装箱值
    • 原语到Number或Object(新功能)
  3. 强制转换
    • long转换为int
    • double转换为float
0
by

评论由:ataggart 发布

prim-conversion-update-1.patch适用于当前master分支。

0
by

评论由:ataggart 发布

已为Reflector重构创建CLJ-792。

0
by

评论由:stuart.sierra发表

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

CLJ-792现在是否是这个补丁的前提条件?

0
by

评论由:ataggart 发布

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

在TPTB没有采取任何行动这么多时间后,您可以将这两个补丁都删除。

0

评论者:jafingerhut

再次,不确定这是否有任何帮助,但从 2012 年 2 月 20 日起测试 Clojure head,应用了 CLJ-792 附件的 clj-792-reorg-reflector-patch2.txt 并然后应用此票据附件的 clj-445-prim-conversion-update-2-patch.txt,结果是编译并通过了所有测试,除 2 个测试外。我不知道这些失败是否容易修复,或者是否可能因这些补丁引入了问题。

0

评论者:bronsa

截至 1.7.0-alpha5,票据描述中的两个示例在没有异常/反射警告的情况下运行

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

0

评论者:fl00r

嗨!

`
(Integer. (Long. 1))

=> 1

(Long. (Integer. 1))

=> 异常

`

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

0
参考:https://clojure.atlassian.net/browse/CLJ-445(ataggart 报告)
...