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

欢迎!请查看关于页面获取更多关于这个工作原理的信息。

0
Clojure
已关闭

问题
当进行 Java 调用(或内联函数)时,如果参数和参数类型均为原始类型,则在定位避免方法/构造函数时不会使用拓宽转换。

示例

`用户=> (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 测试版中。我们将在未来的版本中重新审查。

0

由 ataggart 发表的评论

为更好地理解这些更改,我将它们分成两个补丁,每个补丁包含一系列可隔离的逐步提交。

reorg-reflector.patch: 将编译器中的反射/调用代码移动到Reflector中,并消除了冗余代码。结果是单一代码库用于解决方法和构造函数,这允许在不进行过多外部协调的情况下修改该机制。这不会引起行为上的变化。

prim-conversion.patch: 依赖于上面的 patch。修改了方法/构造函数的解析过程
更符合 Java 解析,尤其是调用 1.5 之前的 API 时
添加了对同一类别原始数值类型宽转换的支持(这比 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 现在是这个票据的先决条件吗?

0

由 ataggart 发表的评论

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

在经过这么久没有来自相关人员的工作后,请随意关闭这两个票据。

0

由:jafingerhut发表的评论

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

0

由: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

由:fl00r发表的评论

哈喽!

`
(Integer. (Long. 1))

=> 1

(Long. (Integer. 1))

=> 异常

`

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

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