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).
已关闭,备注: 固定在1.11.3和1.12.0-alpha10中的CLJ-2843副作用中

26 答案

0
by

评论者:redinger

这项工作太大,目前无法包含在1.3 beta中。我们将在未来的版本中重新考虑。

0
by

评论者:ataggart

为了更好地促进对更改的理解,我已经将它们分成两个补丁,每个补丁都包含多个可隔离、增量提交。

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

prim-conversion.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适用于当前的master。

0

评论者:ataggart

为反射器重组织创建CLJ-792。

0

评论者:stuart.sierra

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

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

0

评论者:ataggart

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

在这段时间以来,如果没有来自TPTB的行动,请随意取消这两个请求。

0

评论者:jafingerhut

再次强调,不确定这对您是否有帮助,但我在2012年2月20日从Clojure头开始测试,应用了CLJ-792附加的clj-792-reorg-reflector-patch2.txt,然后应用了这个请求附加的clj-445-prim-conversion-update-2-patch.txt,结果通过所有测试,除了两项。我不知道这些失败是否容易解决,或者这些补丁可能引入了问题。

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报告)
...