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

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

0
Clojure
已关闭

问题
当进行 Java 呼叫(或内联函数)时,如果参数和参数都是基本类型,则不使用 widened 转换来定位正确的重载方法/构造函数。

示例

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

0

评论人:ataggart

为了更好地促进对更改的理解,我已将它们分成两个补丁,每个补丁都包含一些可隔离的、逐步的提交

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

prim-conversion.patch: 依赖于上述更改。更改方法/构造函数解析过程
与Java解析更一致,尤其是在调用1.5之前版本的API时
增加了对相同类别的原始数值类型的 Widening 转换支持(这比Java更严格,更clojuresque)
* 增加了对编译时通配符匹配的支持(即,您不需要为避免反射而对每个参数进行类型提示)。

这还提供了一个基础,可以添加更多功能,例如CLJ-666。

0

评论人:ataggart

在原处进行了文档说明,以下是反射器使用以查找方法的转换规则:

  1. 按类型进行转换
    **** 对象到祖先类型
    • 原语到同一数值类别的更广的原语(新功能)
  2. 装箱
    • 装箱的数字到它的原语
    • 装箱的数字到同一数值类别的更广的原语(新功能,针对Short和Byte参数)
      **** 原语到它的装箱值
    • 原语到Number或Object(新功能)
  3. 铸模
    • long转int
    • double转float
0

评论人:ataggart

prim-conversion-update-1.patch应用到当前master。

0

评论人:ataggart

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

0

评论者:stuart.sierra

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

CLJ-792现在是这个问题的先决条件吗?

0

评论人:ataggart

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

在与TPTB没有任何行动这么长时间后,您完全可以撤销这两个票据。

0

注释由:jafingerhut发出

再次,不确定这是否有帮助,但是从我测试的Clojure最新的Head版本开始(截至2012年2月20日),应用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报告的)
...