[sealed][15] javac rejects type parameters extending intersection sealed types
Zi Xin
hive7003 at outlook.com
Sat Oct 3 11:03:56 UTC 2020
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