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).
关闭备注: Fixed as a side effect of CLJ-2843 in 1.11.3 and 1.12.0-alpha10

26 答案

0

评论者:redinger

这项工作太大,无法纳入1.3beta。我们将为未来的版本重新考虑。

0

评论者:ataggart

为了更好地促进变革的理解,我已经将它们分成两个补丁,每个补丁都有一个由多个可隔离的增量提交组成的多个部分

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

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补丁,结果是编译并通过了除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报告)
...