[ https://issues.apache.org/jira/browse/GROOVY-11059?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17722866#comment-17722866 ]
Eric Milles edited comment on GROOVY-11059 at 5/15/23 5:49 PM: --------------------------------------------------------------- Groovy constructor shorthand syntax is available: {code:groovy} class MyClass { MyClass(String s) { // ... } } MyClass anObject = ["SomeString"] {code} "def anObject = 'SomeString' as MyClass" requires String/CharSequence/... {{asType(MyClass)}}, which you could supply just to your block with "use": {code:groovy} class Cat { static <T> T asType(String string, Class<T> type) { if (type == MyClass) { return new MyClass(string) } else { // continue cast as type: StringGroovyMethods.asType(string, type) } } } use (Cat) { def obj = 'foobar' as MyClass print obj } {code} You can add "equals(Object)" or "compareTo(String)" to MyClass to support "mc == 'str'". And "'str' == mc" by adding the reverse to Cat; be sure to delegate to the default groovy method for other RHS types if you want "'str' == number" to still work in your use block. Implicit conversion like "MyClass mc = 'str'" or "mc == 'str'" is a slippery slope. There is no general mechanism for introducing new conversions. Is this what your request is? was (Author: emilles): Groovy constructor shorthand syntax is available: {code:groovy} class MyClass { MyClass(String s) { // ... } } MyClass anObject = ["SomeString"] {code} "def anObject = 'SomeString' as MyClass" requires String/CharSequence/... {{asType(MyClass)}}, which you could supply just to your block with "use": {code:groovy} class Cat { static <T> T asType(String string, Class<T> type) { if (type == MyClass) { return new MyClass(string) } else { // continue cast as type: StringGroovyMethods.asType(string, type) } } } use (Cat) { def obj = 'foobar' as MyClass print obj } {code} You can add "equals(String)" or "compareTo(String)" to MyClass to support "mc == 'str'". And "'str' == mc" by adding the reverse to Cat; be sure to delegate to the default groovy method for other RHS types if you want "'str' == number" to still work in your use block. Implicit conversion like "MyClass mc = 'str'" or "mc == 'str'" is a slippery slope. There is no general mechanism for introducing new conversions. Is this what your request is? > Want a way to define casting/coercing FROM other classes as part of my class > ---------------------------------------------------------------------------- > > Key: GROOVY-11059 > URL: https://issues.apache.org/jira/browse/GROOVY-11059 > Project: Groovy > Issue Type: Wish > Reporter: Jim Klimov > Priority: Major > > Java has basic casting which relies on one object having a class/interface > which is descendant of another in the equation. Groovy extends this with > coercion which relies on the origin class defining an {{asType()}} method to > state how convert it into an instance of a target class. > For example, if I want to assign my class from a standard {{String}} I'd have > to hack with metaclass of String to extend its {{asType}} to recognize > {{MyClass}} and coerce INTO it, and then I'd be able to say: > {code:java} > MyClass myval = "SomeString" as MyClass{code} > This is clumsy both on implementation side (hacking into other people's code > is not too portable, and has complications with code that runs this hack many > times like a Jenkins Shared Library that would change server JVM's String > over and over for each run), and on coding side (while "as SomeClass" is > explicit, someone has to write it which adds noise in refactorings and goes > against the type simplicity trend of the language). > My proposal is to support a common optional method everywhere, in the > groovyish manner of plastering so many other optional operator overloads like > {{{}asType(){}}}, {{{}isCase(){}}}, {{plus()}} et al, which would be > effectively an inverse {{asType()}} and overload the assignment operator. > By default it could invoke single-parameter constructors (e.g. if I define a > {{MyClass(String)}} one - that can be used to cast the assignment from a > {{{}String{}}}), and it might be extensible if someone has more complex ideas > for their class (e.g. change something in the existing instance instead of > creating a new one, if the override is non-static, or if it generally gets a > parameter with an instance of this class and this parameter is null or not). > Either way, for script writers it would be just a simple assignment symbol > with smarts behind the curtain. > Possibly this might fill in the gap of current {{equals()}} overload that did > not always work well for me (possibly due to ancient groovy in Jenkins core) > to check {{{}if (myClassVal == "somestring") {...{}}}} -- This message was sent by Atlassian Jira (v8.20.10#820010)