java 17: anonymous classes with diamonds

Anna Kozlova anna.kozlova at jetbrains.com
Mon Jan 18 13:56:31 UTC 2021


Thanks!

Not sure if it's exactly the same issue, could you please check as well? At
least the error message is not very helpful: "cannot find symbol
  symbol:   class <captured wildcard>
  location: class foo.Boo<T>" (no line number)

```

import java.util.List;
import java.util.function.Predicate;

public class Boo<T> {
    public Boo(List<? extends T> l) {
    }
    void m(List<? extends String> list){
        Boo<String> boo3 = new Boo<>(findAll(list, s -> s.length() > 0)){};
    }

    static <T> List<T> findAll(List<? extends T> collection,
                               Predicate<? super T> condition) {
        return null;
    }
}

```

If I remove anonymous class braces, the code starts to compile. Checked
with with java 11 & java 17

Thanks,
Anna

P.S. I've migrated IntelliJ sources to java 11 diamonds, thus the issues.
This one is the last issue I could reproduce with java 17. A lot of issues
have been fixed since java 11!

On Mon, Jan 18, 2021 at 11:18 AM Srikanth <srikanth.adayapalam at oracle.com>
wrote:

> Thanks for the problem report Anna.
>
> It does look suspect and I have raised JDK-8259910 to follow up.
>
> This problem dates back to jdk9 and is reproducible in all the major
> releases from then on.
>
> Srikanth
>
> On 18/01/21 3:08 pm, Anna Kozlova wrote:
>
> Hi all,
>
> The following code doesn't compile with java 17 eap (java: foo.Boo.Nested
> is abstract; cannot be instantiated)
> ```
> public class Boo {
>
>     static abstract class Nested<T> {
>         protected Nested(Class<T> aAcceptedClass) { }
>
>     }
>     static class Outer<T>  {
>         protected Outer(final Nested<T> condition) { }
>     }
>
>     static final Outer<Boo> PATTERN = new Outer<>(new Nested<>(Boo.class) {}) {};
> }
>
> ```
> though the anonymous class is used.
>
> At the same time, if I remove the anonymous class from outer call, like
> `static final Outer<Boo> PATTERN = new Outer<>(new Nested<>(Boo.class)
> {});` the code would compile.
>
> If explicit types instead of diamonds are used, everything compiles fine
> as well.
>
> To me this looks like a bug in the compiler, could someone check this
> please?
>
> Thanks,
> Anna
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20210118/46d0acaf/attachment-0001.htm>


More information about the compiler-dev mailing list