如果我没有读错JLS§8.1.6和§9.1.4,那么密封类/接口允许的类只有direct个子类/接口.
为了说明这一点,请考虑以下示例:
public sealed interface I1 permits I2, C, D { /*...*/ }
public final class C implements I1 { /*...*/ }
public final class D implements I1 { /*...*/ }
public sealed interface I2 extends I1 permits E, F { /*...*/ }
public final class E implements I2 { /*...*/ }
public final class F implements I2 { /*...*/ }
如果我正确理解了规范,I1
显然允许C
和D
,但不允许E
和F
(通过从I1
到I2
的extends
层次 struct ).这样对吗?
我问的原因是,以下类型的切换表达式允许使用哪些模式:
I1 i1 = // ...
return switch (i1) {
case C c -> "1";
case D d -> "2";
case E e -> "3"; // Can we match over E?
case F f -> "4"; // Can we match over F?
default -> "5";
};