You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@groovy.apache.org by OCsite <oc...@ocs.cz> on 2024/11/23 15:53:04 UTC

Override new (was: [EXT] Using `var` as method return type placeholder)

Hi there,

> On 23. 11. 2024, at 4:12, MG <mg...@arscreat.com> wrote:
> Groovy new can be overridden to return a different type on purpose

can it? How? (Aside of an ASTT which would be a bit at the complex side for such a trivial thing.) I must have missed this thing in the documentation somewhere, and searching the documentation for “new” or “override” does not really help for obvious reasons :)

I am using consistently newInstance in my code so that I can override it easily if need be; a possibility to use the plain ole new same way would be nice, especially when working with a legacy code.

Thanks,
OC

Re: Override new

Posted by MG <mg...@arscreat.com>.
Hi OC,

I had to check (since I don't use code like that), and it is not 
overriding/overloading the new operator per se, but replacing a ctor of 
a class through its metaClass (see code below).

Cheers,
mg


import groovy.transform.Canonical

@Canonical class Goo { String s }
@Canonical class FooFoo { String s }

Goo.metaClass.constructor = { String s -> new FooFoo(s) }

final goo = new Goo("abc")
println SV(goo,goo.getClass())  // goo=FooFoo(abc), goo.getClass()=class 
FooFoo

println SV(new Goo("abc")) // new Goo(abc)=FooFoo(abc)
println SV(new Goo("abc").getClass()) // new Goo(abc).getClass()=class 
FooFoo



On 23/11/2024 16:53, OCsite wrote:
> Hi there,
>
>> On 23. 11. 2024, at 4:12, MG <mg...@arscreat.com> wrote:
>> Groovy new can be overridden to return a different type on purpose
>
> can it? How? (Aside of an ASTT which would be a bit at the complex 
> side for such a trivial thing.) I must have missed this thing in the 
> documentation somewhere, and searching the documentation for “new” or 
> “override” does not really help for obvious reasons :)
>
> I am using consistently /newInstance/ in my code so that I can 
> override it easily if need be; a possibility to use the plain ole 
> /new/ same way would be nice, especially when working with a legacy code.
>
> Thanks,
> OC