使用nfc工具的clojure classcastexception错误

使用nfc工具的clojure classcastexception错误,clojure,nfc,Clojure,Nfc,我在Clojure使用grundid的NFC库,但当我尝试写作时,我会遇到一个讨厌的bug。在Java中,它可以工作: public class TextWriter implements NdefOperationsListener { @Override public void onNdefOperations(NdefOperations ndefOperations) { System.out.println("Formated: " + ndefOperations.isFo

我在Clojure使用grundid的NFC库,但当我尝试写作时,我会遇到一个讨厌的bug。在Java中,它可以工作:

public class TextWriter implements NdefOperationsListener {

@Override
public void onNdefOperations(NdefOperations ndefOperations) {
    System.out.println("Formated: " + ndefOperations.isFormatted() + " Writable: " + ndefOperations.isWritable());
    if (ndefOperations.isWritable()) {
        System.out.println("Writing NDEF data...");
        TextRecord record = new TextRecord("It works!");
        if (ndefOperations.isFormatted())
            ndefOperations.writeNdefMessage(record);
        else
            ndefOperations.format(record);
        System.out.println("Done");
    }
    else
        System.out.println("Tag not writable");
}
它从以下代码开始:

protected void launchDemo(NfcTagListener... listeners) throws IOException {
    NfcAdapter nfcAdapter = new NfcAdapter(TerminalUtils.getAvailableTerminal(), TerminalMode.INITIATOR, this);
    for (NfcTagListener tagListener : listeners)
        nfcAdapter.registerTagListener(tagListener);
    nfcAdapter.startListening();
    System.out.println("Waiting for tags, press ENTER to exit");
    System.in.read();
}
此代码由以下人员启动:

test.launchDemo(new MfClassicNfcTagListener(new TextWriter()));
无论如何,这是有效的

clojure代码:

(defn ndef-writer []
  (proxy [NdefOperationsListener] []
    (onNdefOperations [ndefOperations]
                  (println (str "Formatted: " (.isFormatted ndefOperations) " Writable: " (.isWritable ndefOperations)))
                  (if (.isWritable ndefOperations)
                    (do
                      (println "Writing NDEF data...")
                      (if (.isFormatted ndefOperations)
                        (.writeNdefMessage ndefOperations test-record)
                        (.format ndefOperations test-record)))
                    (println "Tag not writable")))

(defn write-demo []
  (doto @nfc-adapter (.registerTagListener (new MfClassicNfcTagListener    (ndef-writer))))
  (.startListening @nfc-adapter)
  (println "Waiting for tag..."))

(defn write-nfc-card []
   (try
     (write-demo)
   (catch Exception e (str "caught exception: " (.getMessage e)))))
但是当我运行clojure代码时,我得到了以下错误:

java.lang.ClassCastException: Cannot cast org.nfctools.ndef.wkt.records.TextRecord to [Lorg.nfctools.ndef.Record;

at java.lang.Class.cast(Class.java:3258)

at clojure.lang.Reflector.boxArg(Reflector.java:427)

at clojure.lang.Reflector.boxArgs(Reflector.java:460)

at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:58)

at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)

at duva_desktop.nfc.write$ndef_writer$fn__6403.invoke(write.clj:48)

at duva_desktop.nfc.write.proxy$java.lang.Object$NdefOperationsListener$62ccf694.onNdefOperations(Unknown Source)

at org.nfctools.mf.classic.MfClassicNfcTagListener.handleTag(MfClassicNfcTagListener.java:54)

at org.nfctools.NfcAdapter.onTag(NfcAdapter.java:81)

at org.nfctools.spi.acs.InitiatorTerminalTagScanner.handleCard(InitiatorTerminalTagScanner.java:89)

at org.nfctools.spi.acs.InitiatorTerminalTagScanner.run(InitiatorTerminalTagScanner.java:55)

at java.lang.Thread.run(Thread.java:745)
我基本上编写了相同的代码,但在Clojure中,它失败了,因为它无法将TextRecord转换为Record(TextRecord扩展了WellKnownRecord,它扩展了Record)(它无论如何都不应该尝试转换?)

提前谢谢

p、 美国


我不熟悉NFC,但错误消息中很好地解释了问题:

java.lang.ClassCastException: Cannot cast org.nfctools.ndef.wkt.records.TextRecord to [Lorg.nfctools.ndef.Record;
注意类名前面的L。L表示它是一个数组。您正在调用的方法很可能采用varargs,在java中这意味着它是数组。因此,您的代码可以在java中工作,但不能在clojure中工作。在clojure中,您必须显式传递数组,您可以这样做:

(into-array [test-record])

如果您提供完整的stacktrace,可能会有所帮助。只是一个小评论-使用一个更好的实践,使用代理代理-见StasOfFuff.com /Strus/5821892/WHY-YORK-I U-ReIF-ION-PROXION-PROXIX-CYJURY这里YAGO,TNX的帮助-将阅读到它(ReI化)我现在使用RePig,当然仍然不工作,但不知道关于化,所以我会使用它。该死…谢谢你,伙计!writeNdefMessage应该是(Record…records),所以在java中它实际上可以获得单个项或数组。我不知道L是一个数组,谢谢。这就是为什么它对我来说不是那么明显的原因,哈哈。但是这是一个特性还是一个bug?在jvm中,varargs方法的args总是一个数组。java编译器在调用时会隐藏该数组,而clojure编译器则不会,因此必须构造数组。也许是一个有争议的设计决定,但绝对不是一个bug。
java.lang.ClassCastException: Cannot cast org.nfctools.ndef.wkt.records.TextRecord to [Lorg.nfctools.ndef.Record;
(into-array [test-record])