This would be both expensive and problematic with static mode, which is
what I use almost exclusively for production code.

On Tue, Apr 27, 2021, 20:26 Remi Forax <fo...@univ-mlv.fr> wrote:

> ----- Mail original -----
> > De: "Christopher Smith" <chrylis+gro...@gmail.com>
> > À: "dev" <dev@groovy.apache.org>
> > Envoyé: Mercredi 28 Avril 2021 01:37:14
> > Objet: GDK retrofit for Java functional interfaces
>
> > Since Paul is now threatening us with a 4.0 beta, I wanted to float an
> > idea that I've been thinking over for a bit now that might be best to
> > add there (though maybe it would be okay in 3 still, with the Java 8
> > baseline).
> >
> > A large number of the GDK extension methods (particularly stuff like
> > `with`, `collect`, and similar) have signatures that rely explicitly
> > on Closure for their strategies. This means that there are
> > interoperability problems with libraries that provide strategy
> > implementations as functional types; e.g., imagine this trivial
> > example:
> >
> > ```
> > public UnaryOperator<Integer> multiplier(int multiplicand) {
> >  return x -> x * multiplicand;
> > }
> > ```
> >
> > I can't say `[1, 2, 3].collect(multiplier(2))`, because `collect`
> > takes only a Closure.
> >
> > I would like to (ideally) alter the signatures of the methods in
> > DefaultGroovyMethods and similar to replace Closure with the "more
> > static" interfaces where possible; most of these cases would end up
> > being Function, Consumer, and some of the other usual suspects, with
> > some of the extension methods being duplicated to account for the
> > cases where the GDK currently does runtime magic like arity detection.
> > In the alternative, at least adding overrides for these would support
> > language-level interoperability.
> >
> > What is the opinion regarding making this change, and what kinds of
> > compatibility problems might result from replacing Closure with (e.g.)
> > Function rather than adding a new override?
>
> It may be simpler to have a conversion from any instance of a functional
> interface to a Closure,
> with closure.call() calling the abstract method of the functional
> interface.
>
> This will require to check at runtime if a class implement a functional
> interface, to wrap the instance in a Closure.
> It would be cool if the annotation @FunctionalInterface was declared with
> a retention RUNTIME, so the check to know if an instance is a lambda or not
> will be easy.
> But wait, it's already the case, someone thought about that in the lambda
> expert group :)
>
> Rémi
>

Reply via email to