Have you considered writing a wrapper method in Scala and calling that? Thanks, Ambrose
On Fri, Jun 26, 2015 at 7:24 PM, Stephen Wakely <fungus.humun...@gmail.com> wrote: > Sorry about the double threads - I messed up and thought the original post > didn't go through. > > Looking further into this it seems in Java generics are largely a compile > time thing. The generic type information is wiped out from the type on > compile. So how does Java know which overload to call when the only > difference in the generic type of the parameter? > > The answer is - it doesn't. > > I whipped up a quick bit of Java to test this : > > > > public static String Onk(ArrayList<String> str) { > System.out.println("string"); > return ""; > } > > public static int Onk(ArrayList<Integer> it) { > System.out.println("int"); > return 0; > } > > > > This fails to compile : > > > Error:(11, 24) java: name clash: > Onk(java.util.ArrayList<java.lang.Integer>) and > Onk(java.util.ArrayList<java.lang.String>) have the same erasure > > > > > This sort of thing doesn't seem to be a problem for Scala, so it must be > doing something funky under the hood to resolve these methods. > > > Now, I can get the generic information about these methods using > reflection : > > (->> Dist$/MODULE$ type .getMethods vec (map #(.getGenericParameterTypes > %)) pprint) > > gives me : > > ([#<ParameterizedTypeImpl > scala.collection.Seq<scala.Tuple2<java.lang.Object, > com.cra.figaro.language.Element<T>>>>, > #<ParameterizedTypeImpl com.cra.figaro.language.Name<T>>, > com.cra.figaro.language.ElementCollection] > [#<ParameterizedTypeImpl > scala.collection.Seq<scala.Tuple2<com.cra.figaro.language.Element<java.lang.Object>, > com.cra.figaro.language.Element<T>>>>, > #<ParameterizedTypeImpl com.cra.figaro.language.Name<T>>, > com.cra.figaro.language.ElementCollection] > > > So in theory I think I should be able to hack something together to > resolve to the correct method. It won't be fast - or elegant, but hopefully > it can work. > > > Thanks > > > > > On Fri, Jun 26, 2015 at 3:38 AM Ambrose Bonnaire-Sergeant < > abonnaireserge...@gmail.com> wrote: > >> That was meant as a response to the other thread. >> >> On Fri, Jun 26, 2015 at 10:35 AM, Ambrose Bonnaire-Sergeant < >> abonnaireserge...@gmail.com> wrote: >> >>> They apparently differ in the return type. I don't think >>> clojure.lang.Reflector considers the return type hint >>> when resolving methods. >>> >>> Thanks, >>> Ambrose >>> >>> On Fri, Jun 26, 2015 at 4:16 AM, Stephen Wakely < >>> fungus.humun...@gmail.com> wrote: >>> >>>> javap gives : >>>> >>>> public <T> com.cra.figaro.language.AtomicDist<T> >>>> apply(scala.collection.Seq<scala.Tuple2<java.lang.Object, >>>> com.cra.figaro.language.Element<T>>>, com.cra.figaro.language.Name<T>, >>>> com.cra.figaro.language.ElementCollection); >>>> >>>> public <T> com.cra.figaro.language.CompoundDist<T> >>>> apply(scala.collection.Seq<scala.Tuple2<com.cra.figaro.language.Element<java.lang.Object>, >>>> com.cra.figaro.language.Element<T>>>, com.cra.figaro.language.Name<T>, >>>> com.cra.figaro.language.ElementCollection); >>>> >>>> >>>> Bit of an eyesore, but the two methods only differ in the generic >>>> types.. >>>> >>>> On Thu, Jun 25, 2015 at 9:11 PM Stephen Wakely < >>>> fungus.humun...@gmail.com> wrote: >>>> >>>>> >>>>> So using reflection on the objects gives the following signatures - >>>>> they have identical signatures : >>>>> >>>>> {:name apply, >>>>> :return-type com.cra.figaro.language.CompoundDist, >>>>> :declaring-class com.cra.figaro.language.Dist$, >>>>> :parameter-types >>>>> [scala.collection.Seq >>>>> com.cra.figaro.language.Name >>>>> com.cra.figaro.language.ElementCollection], >>>>> :exception-types [], >>>>> :flags #{:public}} >>>>> {:name apply, >>>>> :return-type com.cra.figaro.language.AtomicDist, >>>>> :declaring-class com.cra.figaro.language.Dist$, >>>>> :parameter-types >>>>> [scala.collection.Seq >>>>> com.cra.figaro.language.Name >>>>> com.cra.figaro.language.ElementCollection], >>>>> :exception-types [], >>>>> :flags #{:public}} >>>>> >>>>> >>>>> On Thu, Jun 25, 2015 at 9:05 PM Stuart Sierra < >>>>> the.stuart.sie...@gmail.com> wrote: >>>>> >>>>>> Scala has to compile down to JVM bytecode just like Clojure, but it >>>>>> may change method signatures along the way. >>>>>> >>>>>> You could try running `javap` to disassemble the compiled Scala >>>>>> bytecode and figure out what the method signatures actually are. Or use >>>>>> Java reflection to examine the objects you have and see what methods they >>>>>> declare. >>>>>> >>>>>> –S >>>>>> >>>>>> >>>>>> >>>>>> On Tuesday, June 23, 2015 at 10:51:55 AM UTC-4, Stephen Wakely wrote: >>>>>>> >>>>>>> I am trying to call into some Scala that has the following >>>>>>> overloaded methods : >>>>>>> >>>>>>> def apply[T](clauses: (Double, Element[T])*)(implicit name: >>>>>>> Name[T], collection: ElementCollection) = >>>>>>> new AtomicDist(name, clauses.toList, collection) >>>>>>> >>>>>>> def apply[T](clauses: (Element[Double], Element[T])*)(implicit >>>>>>> name: Name[T], collection: ElementCollection) = >>>>>>> new CompoundDist(name, clauses.toList, collection) >>>>>>> >>>>>>> So one method takes a list of tuples of Double to Element and the >>>>>>> other method takes a list of tuples of Element to Element. >>>>>>> >>>>>>> I am using t6.from-scala (https://github.com/t6/from-scala) to >>>>>>> build up my list of Tuples. But when building these up there is no way >>>>>>> to >>>>>>> specify explicit type information about the collections. Consequently >>>>>>> when >>>>>>> calling this apply method Clojure will always choose to call the first >>>>>>> method - even when my list is a collection of Element to Element tuples. >>>>>>> >>>>>>> I can definitely appreciate how it is going to be tricky for Clojure >>>>>>> to determine the correct overload to use here. Is there any way I can >>>>>>> somehow force it to call the correct overload myself? >>>>>>> >>>>>>> >>>>>>> Thanks >>>>>>> >>>>>>> Stephen >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> To post to this group, send email to clojure@googlegroups.com >>>>>> Note that posts from new members are moderated - please be patient >>>>>> with your first post. >>>>>> To unsubscribe from this group, send email to >>>>>> clojure+unsubscr...@googlegroups.com >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/clojure?hl=en >>>>>> --- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to clojure+unsubscr...@googlegroups.com. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clojure@googlegroups.com >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> To unsubscribe from this group, send email to >>>> clojure+unsubscr...@googlegroups.com >>>> For more options, visit this group at >>>> http://groups.google.com/group/clojure?hl=en >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to clojure+unsubscr...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.