2024 Clojure现状调查!(State of Clojure Survey!)中分享您的想法!

欢迎!请查阅关于页面以了解更多关于此页工作方式的详细信息。

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

此功能也已就地文档化,但以下是反射器用来查找方法的转换规则

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