java - Java调用Clojure函数时如何处理不同的返回类型?

标签 java clojure interop

我想从 Java 调用 binomial Clojure 函数。我遇到的一个问题是它返回不同的数据类型,long(例如,n=5、k=3)或BigInt(例如,n=20、k= 10).在 Java 端,它应该是一个 BigInteger。

至少有两个选项可以克服这个问题,哪个更可取?

  1. 强制 Clojure 函数返回 BigInt(我不知道这是否可能。我尝试了类型提示,但它仍然返回 longBigInt)。
  2. 在 Java 中,对返回值使用模式匹配并检查类型,然后进行适当的转换。

Clojure

(ns sample.hello
  (:import (clojure.lang BigInt)))

(defn binomial
      "Calculate the binomial coefficient."
      ^BigInt [^Integer n ^Integer k]
      (let [a (inc n)]
           (loop [b 1
                  c 1]
                 (if (> b k)
                   c
                   (recur (inc b) (* (/ (- a b) b) c))))))

Java

public class Hello {
    public static final IFn binomial;

    static {
        Clojure.var("clojure.core", "require").invoke(Clojure.read("sample.hello"));
        binomial = Clojure.var("sample.hello", "binomial");
    }

    public static BigInteger binomial(int n, int k) {
        Object a = binomial.invoke(n, k);
        return ((BigInt) a).toBigInteger();
    }
}

最佳答案

您还可以使用函数 biginteger强制 Clojure 返回 java.math.BigInteger(并避免在 Java 中进行转换):

(defn binomial
  "Calculate the binomial coefficient."
  [^Integer n ^Integer k]
  (let [a (inc n)]
    (loop [b 1
           c 1]
      (if (> b k)
        (biginteger c)
        (recur (inc b) (* (/ (- a b) b) c))))))

测试:

(class (binomial 5 3))
=> java.math.BigInteger
(class (binomial 20 10))
=> java.math.BigInteger

关于java - Java调用Clojure函数时如何处理不同的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74199538/

相关文章:

java - 以标准格式打印 XML 元素

data-structures - 了解 Clojure 中的变量

c# - 如何调试 C# 托管/非托管编码异常?

c# - PresentationSource.FromVisual(this) 在 WPF 中返回空值

c# - 托管 C# 代码未发生非托管调用

java - 保护实体免受 Hibernate 中的级联删除

java - 将自定义工具控件添加到工具栏 E4

java - 使用 PHP 重写 Java 程序,而无需将源代码留在客户的服务器上

经典 Web 应用程序的 Clojure 和 noir

debugging - 如何在 Clojure 中跟踪代码执行?