I want to fully understand what is going on before doing anything. Interestingly if I convert the Java code below to Scala it fails to compile with the same error :
def Onk(str: util.ArrayList[String]): String = { println("String") "erk" } def Onk(it: util.ArrayList[Integer]): Integer = { println("Int") 0 } But changing it to using (I think) more idiomatic Scala compiles and runs fine. def Onk(str: (String)*): String = { println("String") "erk" } def Onk(it: (Integer)*): Integer = { println("Int") 0 } On Fri, Jun 26, 2015 at 12:27 PM Ambrose Bonnaire-Sergeant < abonnaireserge...@gmail.com> wrote: > 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. > -- 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.