2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面了解有关如何操作的更多信息。

+3
记录和类型

使用Java 21 JDK编译实现List的deftype将创建包含对(Java 21新增)SequencedCollection类型的引用的类(该类型引入了一个新方法reverse)。在较旧的Java运行时中加载编译后的类将抛出异常,因为SequencedCollection类型不存在。

给定repro.clj

(ns repro)

(deftype C []
  java.util.List)

使用Java 21 JDK编译到一个类,javap显示

public final class repro.C implements java.util.List,clojure.lang.IType {
  public repro.C();
    Code:
       0: aload_0
       1: invokespecial #13  // Method java/lang/Object."<init>":()V
       4: return

  public static clojure.lang.IPersistentVector getBasis();
    Code:
       0: invokestatic  #20  // Method clojure/lang/Tuple.create:()Lclojure/lang/IPersistentVector;
       3: areturn

  public java.util.SequencedCollection reversed();
    Code:
       0: aload_0
       1: invokeinterface #25,  1   // InterfaceMethod java/util/List.reversed:()Ljava/util/List;
       6: areturn

  public static {};
    Code:
       0: return
}

在较旧的Java版本中使用Clojure加载此类会抛出异常

user=> (require 'repro)
Execution error (ClassNotFoundException) at jdk.internal.loader.BuiltinClassLoader/loadClass (BuiltinClassLoader.java:641).
java.util.SequencedCollection

List为其父接口SequenceCollection显示了默认的reversed()方法实现。不确定为什么在这里创建了这个转发方法,但据推测它与其他方法不同,因为它是一个转发到父默认方法实现的方法。

1 回答

+1

登录为https://clojure.atlassian.net/browse/CLJ-2838,我在底部放了一些分析。

...