On Thu Mar 1 21:53 2012, sim wrote: > Hi all, > > This has me stumped and I found another message: > https://groups.google.com/forum/?fromgroups#!searchin/clojure/parameterised$20type/clojure/8YxzIYXH49c/xCxkMaGXBzUJ > > > that says it isn't possible, but that was back in 2009, is it still not > possible? Any work arounds apart from doing some of it in Java? > > I would like to be able to write some xWiki Macros in clojure, I have some > in java already but moving it all to clojure would be better. > > The java example is as follows: > > public class ExampleMacro extends AbstractMacro<ExampleMacroParameters> > > Which is from here: > http://rendering.xwiki.org/xwiki/bin/view/Main/ExtendingMacro > > Any help/pointers would be greatly appreciated. > > -- sim
Yes, it is possible. At the byte-code level there is (at least at run-time) no difference between a generic and a non-generic class. All methods take/return the generic type just use Object. For example, take the following implementation of AbstractCollection<E>: --- begin ExampleCollection.clj --- (ns ExampleCollection (:gen-class :extends java.util.AbstractCollection)) (def some-numbers [2 3 5 7 11 13]) (defn -size [_] (count some-numbers)) (defn -iterator [_] (.iterator some-numbers)) --- end ExampleCollection.clj --- You can use it as in the following: --- begin Example.java --- import java.util.Collection; public class Example { public static void main(String[] args) { Collection<Long> foo = new ExampleCollection(); for (Long bar : foo) { System.out.println(bar); } } } --- end Example.java --- The Java file will compile and run, though it will complain about doing an unsafe conversion. This means that if the type that occurs at runtime is wrong, you'll get a ClassCastException. In any case, you can also use proxies to accomplish the same task if you don't want to gen-class. I hope this helps. Sincerely, Daniel
signature.asc
Description: Digital signature