[
https://issues.apache.org/jira/browse/GROOVY-9245?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles reassigned GROOVY-9245:
-----------------------------------
Assignee: Eric Milles
> synthetic constructors should be ignored
> ----------------------------------------
>
> Key: GROOVY-9245
> URL: https://issues.apache.org/jira/browse/GROOVY-9245
> Project: Groovy
> Issue Type: Bug
> Reporter: Björn Kautler
> Assignee: Eric Milles
> Priority: Major
>
> Groovy should ignore synthetic constructors when instantiating objects, or at
> most fall back to them if no non-synthetic one is found.
> If you have a Java class with a private constructor and inner classes
> (doesn't matter whether static or non-static) that are subclasses of the
> outer class and call one of the private super-constructors (for example by
> not calling {{super}} explicitly and having a parameterless private
> constructor in the super class, or by calling any private constructor
> explicitly using {{super}}), an additional synthetic package-private
> constructor with a synthetic anonymous inner class of the outer class as
> additional argument that then forwards the call to the private constructor is
> created by the compiler so that the inner class has something non-private to
> call as super constructor.
> So assuming you have this Java class:
> {code:java}
> class Foo {
> private Foo() {
> }
> public Foo(String foo) {
> }
> private static class Bar extends Foo {
> }
> }
> {code}
> and then from Groovy try to call `new Foo(null)` you get the quite unexpected
> (unless you are aware of compiler internals)
> {noformat}
> Ambiguous method overloading for method
> net.kautler.command.api.restriction.Foo#<init>.
> Cannot resolve which method to invoke for [null] due to overlapping
> prototypes between:
> [class net.kautler.command.api.restriction.Foo$1]
> [class java.lang.String]
> {noformat}
> Or with this:
> {code:java}
> class Foo {
> private Foo() {
> }
> private Foo(String foo) {
> }
> public Foo(String foo, String bar) {
> }
> private static class Bar extends Foo {
> public Bar() {
> super(null);
> }
> }
> }
> {code}
> and you try to do from Groovy `new Foo(null, null)`, you get
> {noformat}
> Ambiguous method overloading for method
> net.kautler.command.api.restriction.Foo#<init>.
> Cannot resolve which method to invoke for [null, null] due to overlapping
> prototypes between:
> [class java.lang.String, class
> net.kautler.command.api.restriction.Foo$1]
> [class java.lang.String, class java.lang.String]
> {noformat}
> I'd suggest when searching for a constructor to invoke to first filter out
> the synthetic constructors (or at least the synthetic constructors with a
> synthetic anonymous inner class as last paramter) and only if none was found,
> search in the synthetic ones.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)