I'm trying to create a class that extends input stream Clojure via gen-class. If I want to invoke the parent class' method, how do I do that?
- 1This is an old question, but sometimes it gets attention. FWIW, as I've used Clojure over the years, I've found that if I think I need the power of gen-class to get something like this done, it's easier just to write a little bit of Java.BillRobertson42– BillRobertson422017-04-02 20:03:54 +00:00Commented Apr 2, 2017 at 20:03
2 Answers
From (doc gen-class)1:
:exposes-methods {super-method-name exposed-name, ...} It is sometimes necessary to call the superclass' implementation of an overridden method. Those methods may be exposed and referred in the new method implementation by a local name. So, in order to be able to call the parent's fooBar method, you'd say
(ns my.custom.Foo (:gen-class ; ... :exposes-methods {fooBar parentFooBar} ; ... )) Then to implement fooBar:
(defn -fooBar [this] (combine-appropriately (.parentFooBar this) other-stuff)) 1 In addition to the :gen-class facility provided by ns forms, there is a gen-class macro.
1 Comment
This is not an answer to your actual question, but I have a little library to let you pretend InputStream is an interface instead of a class (so that you don't need gen-class at all). Check out io.core.InputStream, which lets you reify io.core.InputStreamable and get out a customized InputStream. Whatever instance fields you need can just be locals closed over by the reify.
4 Comments
(InputStream. (reify InputStreamable (read ...) (skip ...))).