Re: Java8 ContainingType::methodName references
Sébastien Doeraene <[email protected]> Thu, 3 Mar 2016 23:34:36 +0100
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <CAJwkOg4WRScha4H9BAg6OHPfDMwq_NTCFrfJnxeErM=wx0FVjg@mail.gmail.com> |
For a method without parameter, it becomes: (_: Person).firstname or _.firstname Sébastien On Thu, Mar 3, 2016 at 11:26 PM, <[email protected]> wrote: > Hi, thank you for your reply. > > I just tried this: > > class Person { > def firstname() = { > "Scala" > } > } > > val f: (Person, Person) => Int = _ firstname _ > val g = (_: Person) firstname (_: Person) > > > > But this result in this compilation error: > Error:(9, 23) too many arguments for method firstname: ()String > val g = (_: Person) firstname (_: Person) > ^ > Error:(8, 38) too many arguments for method firstname: ()String > val f: (Person, Person) => Int = _ firstname _ > ^ > > Cheers, > Prag > > > > On Thursday, March 3, 2016 at 10:58:40 PM UTC+1, Sébastien Doeraene wrote: >> >> Hi, >> >> You can get what you want with: >> >> val f: (Person, Person) => Int = _ instanceMethodName _ >> >> or, in the absence of an expected type helping the inference of the type >> of _, >> >> val f = (_: Person) instanceMethodName (_: Person) >> >> Cheers, >> Sébastien >> >> On Thu, Mar 3, 2016 at 10:50 PM, <[email protected]> wrote: >> >>> Java 8 supports method references using the double colon :: operator. >>> https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html >>> >>> There are four types of these: >>> -ContainingClass::staticMethodName (Reference to a static method) >>> -containingObject::instanceMethodName (Reference to an instance method >>> of a particular object) >>> -ContainingType::methodName (Reference to an instance method of an >>> arbitrary object of a particular type) >>> -ClassName::new (Reference to a constructor) >>> >>> In Scala, for example this one is supported: >>> containingObject::instanceMethodName >>> by using: >>> containingObject.instanceMethodName _ >>> >>> But what suprises me is that Scala doesn't seem to support >>> ContainingType::methodName. >>> ContainingType::methodName can be handy when for example you need to >>> dynamically create objects and perform reflections to call getter and >>> setter method in a strong typed way. Which can be handy in UI code and >>> object construction/binding code. >>> >>> Other languages also support this: >>> -Java: >>> https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html >>> -Kotlin: https://kotlinlang.org/docs/reference/reflection.html >>> -Groovy: http://groovy-lang.org/metaprogramming.html (ExpandoMetaClass) >>> -C#: >>> http://joelabrahamsson.com/getting-property-and-method-names-using-static-reflection-in-c/ >>> >>> It would be nice if something like this would be possible in Scala: >>> case class Person(name: String) >>> >>> def getMethodName(....): String = { >>> // .... >>> } >>> >>> getMethodName(Person::name) // returns "name" or "Person.name" >>> >>> >>> >>> Am I missing something? >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "scala-language" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to the Google Groups > "scala-language" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "scala-language" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.