Clojure interop: решить неоднозначный метод - PullRequest
3 голосов
/ 22 декабря 2011

При программировании с использованием TFS SDK (для Java) в Clojure я бы хотел вызвать метод pendEdit, который имеет несколько реализаций (скопирован из javadoc класса com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Workspace):

int pendEdit(ItemSpec[] specs, LockLevel[] lockLevel, FileEncoding[] fileEncoding, GetOptions getOptions, PendChangesOptions pendOptions) 

int pendEdit(ItemSpec[] specs, LockLevel lockLevel, FileEncoding fileEncoding, GetOptions getOptions, PendChangesOptions pendOptions) 

int pendEdit(java.lang.String[] paths, RecursionType recursion, LockLevel[] lockLevel, FileEncoding[] fileEncoding, GetOptions getOptions, PendChangesOptions pendOptions) 

int pendEdit(java.lang.String[] paths, RecursionType recursion, LockLevel lockLevel, FileEncoding fileEncoding, GetOptions getOptions, PendChangesOptions pendOptions)

В своем отчаянии я придумал следующий код, который выглядит мне максимально намекаемым на тип:

(defn checkout-file [^Workspace workspace file]
  (let [spec ^ItemSpec (item-spec-file file)]
    (.pendEdit workspace
               ^"[Lcom.microsoft.tfs.core.clients.versioncontrol.specs.ItemSpec;" (into-array [spec])
               ^LockLevel LockLevel/NONE
               ^FileEncoding FileEncoding/AUTOMATICALLY_DETECT
               ^GetOptions GetOptions/NONE
               ^PendChangesOptions PendChangesOptions/NONE)))

Даже это, кажется, не решает двусмысленность - приводя к следующему исключению:

Exception in thread "main" java.lang.NullPointerException (ts_files.clj:1)
        at clojure.lang.Compiler.eval(Compiler.java:5440)
        at clojure.lang.Compiler.load(Compiler.java:5857)
        at clojure.lang.RT.loadResourceScript(RT.java:340)
        at clojure.lang.RT.loadResourceScript(RT.java:331)
        at clojure.lang.RT.load(RT.java:409)
        at clojure.lang.RT.load(RT.java:381)
        at clojure.core$load$fn__4519.invoke(core.clj:4915)
        at clojure.core$load.doInvoke(core.clj:4914)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:4729)
        at clojure.core$load_lib.doInvoke(core.clj:4766)
        at clojure.lang.RestFn.applyTo(RestFn.java:142)
        at clojure.core$apply.invoke(core.clj:542)
        at clojure.core$load_libs.doInvoke(core.clj:4800)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:542)
        at clojure.core$require.doInvoke(core.clj:4881)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at user$eval1.invoke(NO_SOURCE_FILE:1)
        at clojure.lang.Compiler.eval(Compiler.java:5424)
        at clojure.lang.Compiler.eval(Compiler.java:5414)
        at clojure.lang.Compiler.eval(Compiler.java:5391)
        at clojure.core$eval.invoke(core.clj:2382)
        at clojure.main$eval_opt.invoke(main.clj:235)
        at clojure.main$initialize.invoke(main.clj:254)
        at clojure.main$null_opt.invoke(main.clj:279)
        at clojure.main$main.doInvoke(main.clj:354)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at clojure.lang.Var.invoke(Var.java:369)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:482)
        at clojure.main.main(main.java:37)
Caused by: java.lang.NullPointerException
        at gf.source.teamsystem.api.ts_files$checkout_file.invoke(ts_files.clj:31)
        at gf.source.teamsystem.api.ts_files$eval297.invoke(ts_files.clj:48)
        at clojure.lang.Compiler.eval(Compiler.java:5424)
        ... 31 more

Что нужно сделать, чтобы вызвать вторую реализацию pendEdit?

...