【问题标题】:error in clojure for calling java factory method: more than one matching method found调用java工厂方法的clojure错误:找到多个匹配方法
【发布时间】:2012-09-26 04:52:54
【问题描述】:

在这个例子中 - http://jscience.org/api/javax/measure/package-summary.html,当我尝试在 clojure 中运行时,我得到一个错误。

(import 'javax.measure.unit.SI)
(import 'javax.measure.Measure)

(Measure/valueOf 2 SI/KILOGRAM)
;; => More than one matching method found: valueOf
[Thrown class java.lang.IllegalArgumentException]

这里面还有吗?

更新

实际的java代码是这样的:

public static <Q extends Quantity> Measure<java.lang.Integer, Q> valueOf(
        int intValue, Unit<Q> unit) {
    return new Integer<Q>(intValue, unit);
}

public static <Q extends Quantity> Measure<java.lang.Float, Q> valueOf(
        float floatValue, Unit<Q> unit) {
    return new Float<Q>(floatValue, unit);
}

我得到的错误是:

找到多个匹配方法:valueOf [抛出的类 java.lang.IllegalArgumentException] 重启: 0: [QUIT] 退出 SLIME 顶层 回溯: 0: Compiler.java:2360 clojure.lang.Compiler.getMatchingParams 1:Compiler.java:1555 clojure.lang.Compiler$StaticMethodExpr。 2:Compiler.java:938 clojure.lang.Compiler$HostExpr$Parser.parse 3:Compiler.java:6455 clojure.lang.Compiler.analyzeSeq 4:Compiler.java:6262 clojure.lang.Compiler.analyze 5:Compiler.java:6223 clojure.lang.Compiler.analyze 6:Compiler.java:5618 clojure.lang.Compiler$BodyExpr$Parser.parse 7:Compiler.java:5054 clojure.lang.Compiler$FnMethod.parse 8:Compiler.java:3674 clojure.lang.Compiler$FnExpr.parse 9:Compiler.java:6453 clojure.lang.Compiler.analyzeSeq

【问题讨论】:

  • 在术语注释上,Measure/valueOf 实际上是一个工厂方法,而不是一个构造函数。在 Java 中使用 new 关键字调用构造函数,而 valueOf 是一个普通的静态方法,它返回一个 Measure 的实例。
  • 谢谢,改成工厂了

标签: clojure


【解决方案1】:

很可能您正在调用静态重载方法(即Measure.valueOf(double, Unit)Measure.valueOf(float, Unit))。尝试将您的值转换为所需的类型(假设您要调用 Measure/valueOf(float, Unit):

(Measure/valueOf (float 2) SI/KILOGRAM)

【讨论】:

  • 抱歉,我看不到您的问题的任何更新。你能发布你得到的错误吗?
  • 对不起...我当时正在编辑它=)我也提出了错误
  • 你可以自己试一试...在你的依赖项中包含[clj-science/jscience "4.3.1"],然后按照我的做法。
【解决方案2】:

刚刚试了一下,效果很好:

(Measure/valueOf (Integer. 2) SI/KILOGRAM)

这样:

(Measure/valueOf (cast Long 2) SI/KILOGRAM)

【讨论】:

  • 相信我会输入 (long 1),(float 1) 和 (int 1)
  • 是的,那些不做同样的事情。
【解决方案3】:

以下是一些基本的强制转换示例:

(import 'javax.measure.unit.SI)
(import 'javax.measure.Measure)

; Integer Value
; will call: 
;  public static <Q extends Quantity> Measure<java.lang.Integer, Q> valueOf
(Measure/valueOf (Integer. 2) SI/KILOGRAM)

; Long  value 
; will call: 
;  public static <Q extends Quantity> Measure<java.lang.Long, Q> valueOf
(Measure/valueOf (cast Long 2) SI/KILOGRAM)

; Float value
; will call: 
;  public static <Q extends Quantity> Measure<java.lang.Float, Q> valueOf
(Measure/valueOf (Float. 2.0) SI/KILOGRAM)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多