附带的程序可以重现这个问题。我们有一个代理,p',它是java.io.InputStream的子类。java.io.InputStream有三个名为
read的方法:抽象的int read(); int read(byte[] b); 和 int read(byte[] b, int off, int len); 请见http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html。在代理p'的定义中,我们实现了
read的抽象变体,使得`p'成为java.io.InputStream的一个具体实例。
第一次调用的结果为-1,这是预期的。
第二次调用,(<. p (read b 0 n)),应调用java.io.InputStream中的int read(byte[] b, int off, int len);。但实际行为如下
$ clojure1.2 ~/tmp/proxy-bug.clj
主线程中出现异常:java.lang.IllegalArgumentException: 传递给:user$eval1$fn (proxy-bug.clj:0) 的参数数量不正确 (4)
at clojure.lang.Compiler.eval(Compiler.java:5441)
at clojure.lang.Compiler.load(Compiler.java:5858)
at clojure.lang.Compiler.loadFile(Compiler.java:5821)
at clojure.main$load_script.invoke(main.clj:221)
at clojure.main$script_opt.invoke(main.clj:273)
at clojure.main$main.doInvoke(main.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:365)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
原因:java.lang.IllegalArgumentException: 传递给:user$eval1$fn 的参数数量不正确 (4)
at clojure.lang.AFn.throwArity(AFn.java:437)
at clojure.lang.AFn.invoke(AFn.java:51)
at user.proxy$java.io.InputStream$0.read(Unknown Source)
at user$eval1.invoke(proxy-bug.clj:9)
at clojure.lang.Compiler.eval(Compiler.java:5425)
... 10 more
$ clojure1.2 ~/tmp/proxy-bug.clj
主线程中出现异常:java.lang.IllegalArgumentException: 传递给:user$eval1$fn (proxy-bug.clj:0) 的参数数量不正确 (4)
at clojure.lang.Compiler.eval(Compiler.java:5441)
at clojure.lang.Compiler.load(Compiler.java:5858)
at clojure.lang.Compiler.loadFile(Compiler.java:5821)
at clojure.main$load_script.invoke(main.clj:221)
at clojure.main$script_opt.invoke(main.clj:273)
at clojure.main$main.doInvoke(main.clj:354)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:365)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
原因:java.lang.IllegalArgumentException: 传递给:user$eval1$fn 的参数数量不正确 (4)
at clojure.lang.AFn.throwArity(AFn.java:437)
at clojure.lang.AFn.invoke(AFn.java:51)
at user.proxy$java.io.InputStream$0.read(Unknown Source)
at user$eval1.invoke(proxy-bug.clj:9)
at clojure.lang.Compiler.eval(Compiler.java:5425)
... 10 more