簡體   English   中英

調用將映射作為 java 參數的 clojure 函數時出現問題

[英]Problems calling a clojure function that takes a map as parameter from java

我正在使用帶有幾個模塊的 maven,一個在 java 中,另一個在 clojure 中。 我正在從 java 調用一個 clojure 函數,並希望傳入一個 HashMap 作為參數並返回一個 HashMap。 (我在 clojure 項目上運行了 lein uberjar 和 lein pom 以使其與 maven 一起工作。我可以使用簡單類型(例如 String)為 clojure 函數工作,因此 maven 設置確實有效。)

當我運行一些調用 java 代碼的 java 單元測試時出現以下錯誤:

java.lang.ClassCastException: class clojure.lang.LazySeq cannot be cast to class java.util.Map (clojure.lang.LazySeq is in unnamed module o
f loader 'app'; java.util.Map is in module java.base of loader 'bootstrap')

我怎樣才能讓它工作? 這是從java調用clojure方法的正確方法嗎? 如果 HashMap 將 POJO 對象作為值而不是字符串呢?

我的java代碼:

import interop.Core;

public class BillingCalc {
       static Map<String, String> nonEmptyItems(Map<String, String> items) {
           return Core.non_empty_seats(new HashMap<String, String>());
       }
}

我的clojure代碼:

(ns interop.core
     (:gen-class
      :name interop.Core
      :methods [^{:static true} [apply_vat_to_netto [java.math.BigDecimal java.math.BigDecimal] java.math.BigDecimal]
                ^{:static true} [non_empty_seats [java.util.Map] java.util.Map]]) )


(defn -filter-empty-seats
  "filter out those with empty seats"
  [seats]
  (filter (fn [[_ v]] (pos? (:booked-items v))) seats))

(defn -non_empty_seats
  [java-seats]
  (-filter-empty-seats (into {} java-seats)))

我猜你的錯誤是由:gen-class中的這個定義引起的:

[non_empty_seats [java.util.Map] java.util.Map]]

來自:gen-class 的文檔:

:methods [ [name [param-types] return-type], ...]

返回值的預期類型是java.util.Map ,但-filter-empty-seats中的filter返回clojure.lang.LazySeq的實例。 您應該像這樣重寫-non_empty_seats

(defn -non_empty_seats
  [java-seats]
  (into {} (-filter-empty-seats java-seats)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM