附上一个复现此问题的程序。我们有一个代理,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'
的定义中,我们实现了(method) 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" 中发生异常异常:在 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)
原因:在 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" 中发生异常异常:在 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)
原因:在 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