使用nfc工具的clojure classcastexception错误
我在Clojure使用grundid的NFC库,但当我尝试写作时,我会遇到一个讨厌的bug。在Java中,它可以工作:使用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
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])