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 投票

评论者:ataggart

这部分已经在原地进行了说明,但以下是Reflector用于查找方法的转换规则

  1. 按类型
    ****对象到祖先类型
    • 原始类型到同类别更广泛的原始类型(新功能)
  2. 装箱
    • 装箱的数字到其原始类型
    • 装箱的数字到同类别更广泛的原始类型(对Short和Byte参数的新功能)
      ****原始类型到其装箱值
    • 原始类型到Number或Object(新功能)
  3. 强制类型转换
    • long到int
    • double到float
0 投票

评论者:ataggart

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

0 投票

评论者:ataggart

为Reflector重组织创建CLJ-792。

0 投票

评论者:stuart.sierra

截至f5bcf64,prim-conversion-update-1.patch不适用。

CLJ-792现在是此项任务的前提条件吗?

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,最终结果是编译并通过了所有除了2个测试之外的其他测试。我不知道这些失败是否容易修复,或者这些补丁是否引入了问题。

0 投票
by

评论者: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 投票
by

评论者:fl00r

嗨!

`
(Integer. (Long. 1))

=> 1

(Long. (Integer. 1))

=> 异常

`

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

0 投票
by
...