2014-04-01 24 views
1

我知道這是一個愚蠢的例子,但我很想知道代理方法正在發生什麼。代理傳遞兩個抽象類時的奇怪行爲

我已經設置了兩個呼叫到代理:

1. (DEF CP (代理[java.util.AbstractMap中clojure.asm.ClassVisitor] []))

2. ( def cp (proxy [clojure.asm.ClassVisitor java.util.AbstractMap] []))

第一個調用很好......並且它返回cp。第二次電話會給我一個例外。

clojure.lang.Compiler $ CompilerException:java.lang.IncompatibleClassChangeError:實施類,編譯:(/私有的/ var /文件夾/ DD/qfdy6sbn3mlgk20vcxc3j0ljnpxsqr/T /形狀init4780219965491827451.clj:2:5) 的java。 lang.IncompatibleClassChangeError:實現類 java.lang.ClassLoader.defineClass1 ClassLoader.java
需要java.lang.ClassLoader.defineClass ClassLoader.java:800 需要java.lang.ClassLoader.defineClass ClassLoader.java:643 clojure.lang.DynamicClassLoader .defineClass DynamicClassLoader.java:46 clojure.core/get-proxy-class core_proxy.clj:262

下面發生了什麼?

回答

0

都不會在Clojure 1.6.0中工作。在1.5中,clojure.asm.ClassVisitor是一個接口而不是抽象類。代理期望最多一個類,然後是可選接口。由於java.util.AbstractMap是一個抽象類,它不能出現在類和接口列表中的第二個。