Clojure:调用超类方法

Clojure:调用超类方法,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我有一个无法解决的大问题,我真的没有发现错误 我想使用此功能: (defn atomic-apache-peak-value [x] (let [lamb ((x :parameters) 0) x0 ((x :parameters) 1) f (D2Sigmoid. lamb x0) optimizer (BrentOptimizer. 0.0001 0.0001) maxeval (MaxEval. 1000)

我有一个无法解决的大问题,我真的没有发现错误

我想使用此功能:

(defn atomic-apache-peak-value [x]
  (let [lamb ((x :parameters) 0)
        x0 ((x :parameters) 1)
        f (D2Sigmoid. lamb x0)
        optimizer (BrentOptimizer. 0.0001 0.0001)
        maxeval (MaxEval. 1000)
        of (UnivariateObjectiveFunction. f)
        goal (GoalType/MINIMIZE)
        interval (SearchInterval. x0 (* 2 x0))]
    (-> (.optimize optimizer maxeval of goal interval)
        (.getPoint))))

Apache的测试代码示例如下:

(来源:)

因此,我尝试使用Clojure和另一个函数复制代码:

(defn atomic-apache-peak-value [x]
  (let [lamb ((x :parameters) 0)
        x0 ((x :parameters) 1)
        f (D2Sigmoid. lamb x0)
        optimizer (BrentOptimizer. 0.0001 0.0001)
        maxeval (MaxEval. 1000)
        of (UnivariateObjectiveFunction. f)
        goal (GoalType/MINIMIZE)
        interval (SearchInterval. x0 (* 2 x0))]
    (-> (.optimize optimizer maxeval of goal interval)
        (.getPoint))))
Clojure告诉我“没有找到匹配的方法:针对类进行优化…BrentOptimizer”

我试着在let中一行一行地计算代码,结果成功了,所以问题是优化

该方法在我导入的超类上实现

[org.apache.commons.math3.optim.univariate UnivariateOptimizer BrentOptimizer UnivariateObjectiveFunction SearchInterval]
[org.apache.commons.math3.optim BaseOptimizer MaxEval]
它不会改变任何事情

你认为我是不是有语法问题,有bug,或者只是用了一种错误的方法

谢谢

编辑:

忘了提到

(.optimize optimizer)
版本从Apache引发异常,但已找到。所以我不认为Clojure找不到源代码。 也许有语法问题

还尝试了不带括号的Goaltype/MINIMIZE

编辑2:

最终工作代码

(defn atomic-apache-peak-value [x]
  (let [lamb ((x :parameters) 0)
        x0 ((x :parameters) 1)
        f (D2Sigmoid. lamb x0)
        optimizer (BrentOptimizer. 0.0001 0.0001)
        maxeval (MaxEval. 1000)
        of (UnivariateObjectiveFunction. f)
        goal GoalType/MINIMIZE
        interval (SearchInterval. x0 (* 2 x0))]
    (-> (.optimize optimizer (into-array OptimizationData [maxeval of goal interval]))
        (.getPoint))))

好的,让我们创建一个正确的答案。从Clojure调用Java方法时,查找方法的实际签名很重要。仅仅从Java示例代码复制可能并不总是有效的。这主要是由于瓦尔加。Clojure中的Java互操作要求程序员在涉及vararg时做一些额外的工作

您尝试调用的
optimize
方法的签名是:

public UnivariatePointValuePair optimize(OptimizationData... optData)
                              throws TooManyEvaluationsException
请注意
,这意味着该方法接受0个或多个
优化数据类型的参数。在Java中,只要foo、bar和baz类实现了
OptimizationData
接口,这个方法就可以作为
optimize(foo、bar、baz)
调用

然而,vararg的这种处理主要是由Java编译器完成的。在封面下,该方法实际上需要一个类型为
OptimizationData[]
-array of
OptimizationData
的参数。Java编译器生成将参数打包到数组中的代码,程序员不必担心

但是当从Clojure调用这些方法时,程序员必须创建数组。在Clojure编译器看来,该方法的签名似乎是
optimize(OptimizationData[]optData)

在Clojure中创建一个数组不需要花费很多时间。一种方法是使用
into array
函数。以下显示了必要的位和块:

(import '(org.apache.commons.math3.optim OptimizationData))

(.optimize  (into-array OptimizationData [optimizer maxeval of goal interval]))

此外,不需要在
GoalType/MINIMIZE
周围加括号。括号表示列表,列表在Clojure中作为函数调用进行计算。这里我们不需要调用
GoalType/MINIMIZE
函数,我们只需要该值。

好的,让我们创建一个正确的答案。从Clojure调用Java方法时,查找方法的实际签名很重要。仅仅从Java示例代码复制可能并不总是有效的。这主要是由于瓦尔加。Clojure中的Java互操作要求程序员在涉及vararg时做一些额外的工作

您尝试调用的
optimize
方法的签名是:

public UnivariatePointValuePair optimize(OptimizationData... optData)
                              throws TooManyEvaluationsException
请注意
,这意味着该方法接受0个或多个
优化数据类型的参数。在Java中,只要foo、bar和baz类实现了
OptimizationData
接口,这个方法就可以作为
optimize(foo、bar、baz)
调用

然而,vararg的这种处理主要是由Java编译器完成的。在封面下,该方法实际上需要一个类型为
OptimizationData[]
-array of
OptimizationData
的参数。Java编译器生成将参数打包到数组中的代码,程序员不必担心

但是当从Clojure调用这些方法时,程序员必须创建数组。在Clojure编译器看来,该方法的签名似乎是
optimize(OptimizationData[]optData)

在Clojure中创建一个数组不需要花费很多时间。一种方法是使用
into array
函数。以下显示了必要的位和块:

(import '(org.apache.commons.math3.optim OptimizationData))

(.optimize  (into-array OptimizationData [optimizer maxeval of goal interval]))

此外,不需要在
GoalType/MINIMIZE
周围加括号。括号表示列表,列表在Clojure中作为函数调用进行计算。这里我们不需要调用
GoalType/MINIMIZE
函数,我们只需要该值。

您是否尝试删除
GoalType/MINIMIZE
周围的括号?嗯。。查看javadoc,您可能需要类似于
(.optimize(进入数组优化数据[optimizer maxeval of goal interval]))的内容
。你需要导入org.apache.commons.math3.optim.optimization数据,然后丢失
GoalType/MINIMIZE
哦,我的天啊,非常感谢,它成功了。不知道绑定优化数据。。。要优化数据[]!祝您愉快您是否尝试删除
GoalType/MINIMIZE
周围的括号?嗯。。查看javadoc,您可能需要类似于
(.optimize(进入数组优化数据[optimizer maxeval of goal interval]))的内容
。你需要导入org.apache.commons.math3.optim.optimization数据,然后丢失
GoalType/MINIMIZE
哦,我的天啊,非常感谢,它成功了。不知道绑定优化数据。。。要优化数据[]!祝你有美好的一天