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

欢迎!请访问关于页面了解更多关于这一工作的信息。

0
Clojure
已关闭

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

示例

`user=> (Integer. (byte 0))
java.lang.IllegalArgumentException: No matching ctor found for class 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

为反射器重构创建了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

0
...