附上一个复现此问题的程序。我们有一个代理p', 它是java.io.InputStream的子类。在 java.io.InputStream 中有三种名为
read'的方法:abstract 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的具体实例。
第一次调用,(. p read),返回-1,这符合预期。
第二次调用,(. p (read b 0 n)),应调用java.io.InputStream中的int read(byte[] b, int off, int len);。但实际行为如下
$ clojure1.2 ~/tmp/proxy-bug.clj
异常在主线程 "main" java.lang.IllegalArgumentException: 参数数量不正确(4)传递给:user$eval1$fn (proxy-bug.clj:0)
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
异常在主线程 "main" java.lang.IllegalArgumentException: 参数数量不正确(4)传递给:user$eval1$fn (proxy-bug.clj:0)
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