[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