I have three types, A, B, and C, which are defined as follows:
public sealed interface A extends Comparable<A> permits B<?>, C { ...
public non-sealed interface B<T> extends A { ...
public record C(String s, int i) implements A { ...
Everything compiles and works fine in Eclipse. Now when I run a gradle build, I get an error error: '{' expected at the place of the opening bracket at permits B<?>. When I remove <?>, so that the type definition is as follows (raw type):
public sealed interface A extends Comparable<A> permits B, C { ...
...then gradle doesn't complain and the build is successful. Is this a gradle bug or is the type definition I am using not allowed?
According to the Java Language Specification §8.1.6 the items of the
permitstype list must be without their type parameters.So,
permits B<?>is incorrect and has to be corrected topermits B.Please make sure that
permits B<?>does not give a compile error andpermits B<?>does give aB is a raw type. References to generic type B<T> should be parameterizedwarning instead, has been reported to Eclipse JDT.