[sealed][16ea] type parameter can't extend intersection type including sealed classses

Zi Xin hive7003 at outlook.com
Tue Oct 6 07:34:02 UTC 2020


The problem continues on OpenJDK 16 EA+18-901, windows build


IssueErr.java:4: error: class is not allowed to extend sealed class: Aux0 (as it is not listed in its permits clause)
    <T extends Aux0 & Sti1> T foo();
     ^
IssueErr.java:22: error: class is not allowed to extend sealed class: Aux0 (as it is not listed in its permits clause)
    public <T extends Aux0 & Sti1> T foo() {
            ^
IssueErr.java:27: error: class is not allowed to extend sealed class: Sti1 (as it is not listed in its permits clause)
    public static <T extends Sti1 & Aux0> void bar() {}
                   ^
IssueErr.java:30: error: class is not allowed to extend sealed class: Sti1 (as it is not listed in its permits clause)
    public static <T extends Sti1 & Open> void baz() {}
                   ^
IssueErr.java:33: error: class is not allowed to extend sealed class: Aux0 (as it is not listed in its permits clause)
    public static <T extends Open & Aux0> void thud() {}
                   ^
IssueErr.java:36: error: class is not allowed to extend sealed class: Asc3 (as it is not listed in its permits clause)
    public static <T extends Asc3 & Open> void qux() {}
                   ^
IssueErr.java:39: error: class is not allowed to extend sealed class: Asc3 (as it is not listed in its permits clause)
    public static <T extends Asc3 & Aux0> void corge() {}
                   ^
IssueErr.java:56: error: class is not allowed to extend sealed class: Aux0 (as it is not listed in its permits clause)
class ParameterizedIntersect<E extends Aux0 & Sti1> { }
                             ^
IssueErr.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
8 errors

Best regards,
Zhou Zi-yan

发件人: Zi Xin<mailto:hive7003 at outlook.com>
发送时间: 2020年10月3日 19:04
收件人: amber-dev at openjdk.java.net<mailto:amber-dev at openjdk.java.net>; compiler-dev at openjdk.java.net<mailto:compiler-dev at openjdk.java.net>
主题: [sealed][15] javac rejects type parameters extending intersection sealed types

Hello!

The following code does not compile on openjdk 15 GA:


sealed interface Up permits DownImpl {
    <T extends Aux0 & Sti1> T foo();
}

sealed interface Aux0 permits Ver1 { }

sealed interface Sti1 permits Ver1 { }

sealed abstract class Asc3 permits Ver1 { }

interface Open { }

final class Ver1 extends Asc3 implements Aux0, Sti1 { }

final class Fin2 {}

final class DownImpl implements Up {
    @Override
    //sealed1 & sealed2
    public <T extends Aux0 & Sti1> T foo() {
        return null;
    }

    //sealed2 & sealed1
    public static <T extends Sti1 & Aux0> void bar() {}
    //Intellij 2020.2: "<'T' exte": sealed non-sealed or final modifiers expected

    //sealed2 & non-sealed
    public static <T extends Sti1 & Open> void baz() {}

    //non-sealed & sealed1
    public static <T extends Open & Aux0> void thud() {}

    //sealed abstract & non-sealed
    public static <T extends Asc3 & Open> void qux() {}

    //sealed abstract & sealed1
    public static <T extends Asc3 & Aux0> void corge() {}

    //sealed abstract & non-sealed
    public static <T extends Asc3 & Open> void waldo() {}

//  //non-sealed & sealed abstract
//  public static <T extends Open & Asc3> void grault() {} //should not pass

    //sealed2
    public static <T extends Sti1> T passed_2() {
        return null;
    }
}

//sealed1
class Parameterized<E extends Aux0> { } // passed!
//sealed1 & sealed2
class ParameterizedIntersect<E extends Aux0 & Sti1> { }

--------------------------------------------------------------

javac displays following errors:

IssueErr.java:4: error: class is not allowed to extend sealed class: Aux0
    <T extends Aux0 & Sti1> T foo();
     ^
IssueErr.java:22: error: class is not allowed to extend sealed class: Aux0
    public <T extends Aux0 & Sti1> T foo() {
            ^
IssueErr.java:27: error: class is not allowed to extend sealed class: Sti1
    public static <T extends Sti1 & Aux0> void bar() {}
                   ^
IssueErr.java:31: error: class is not allowed to extend sealed class: Sti1
    public static <T extends Sti1 & Open> void baz() {}
                   ^
IssueErr.java:34: error: class is not allowed to extend sealed class: Aux0
    public static <T extends Open & Aux0> void thud() {}
                   ^
IssueErr.java:37: error: class is not allowed to extend sealed class: Asc3
    public static <T extends Asc3 & Open> void qux() {}
                   ^
IssueErr.java:40: error: class is not allowed to extend sealed class: Asc3
    public static <T extends Asc3 & Aux0> void corge() {}
                   ^
IssueErr.java:43: error: class is not allowed to extend sealed class: Asc3
    public static <T extends Asc3 & Open> void waldo() {}
                   ^
IssueErr.java:57: error: class is not allowed to extend sealed class: Aux0
class ParameterizedIntersect<E extends Aux0 & Sti1> { }
                             ^
Note: IssueErr.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
9 errors

Process finished with exit code 1

---------------------------------

I would expect that the code compiles since a final class name may be used in type bound declarations [1]. IMO the same goes for sealed classes.
And I couldn't find any topic on it in the spec[2][3] or JEP[4].
Is it an implementation oversight or a spec issue?

Best regards,
Zhou Zi-yan


[1]
final class FinalV1 {}
class Pa1<T extends FinalV1> {}
[2] https://docs.oracle.com/javase/specs/jls/se15/jls15.pdf
[3] https://docs.oracle.com/javase/specs/jls/se15/preview/specs/sealed-classes-jls.html
[4] http://openjdk.java.net/jeps/360



More information about the amber-dev mailing list