You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java密封类/接口的许可关系是否具有传递性?

关于Java密封接口许可类型与switch模式匹配的问题

你的理解存在偏差,密封类/接口的许可类型包含整个继承层级中的所有最终实现类,而非仅直接子类/接口。

根据JLS §8.1.6和§9.1.4的定义,密封类型的permits列表指定的是直接子类型(子接口或子类),但如果这些直接子类型本身也是密封类型,它们的许可类型也会被纳入原密封类型的完整合法子类型集合中。简单来说,密封类型的合法子类型是其整个继承树中所有的最终(final)、非密封(non-sealed)类型,形成一个封闭的类型集合。

结合你给出的代码示例:

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的permits列表包含I2、C、D,而I2作为密封接口,它的permits列表是E、F。因此I1的所有合法子类型包括C、D、E、F——E和F虽然是I2的直接实现类,但属于I1密封层级的一部分,是I1的合法子类型。

回到你关心的switch表达式问题:

I1 i1 = // ...
return switch (i1) {
    case C c -> "1";
    case D d -> "2";
    case E e -> "3"; // 可以匹配E
    case F f -> "4"; // 可以匹配F
    default  -> "5";
};

case E e和case F f是可以正常匹配的,因为E和F都是I1的合法子类型。甚至你可以去掉default分支,编译器不会报错——因为C、D、E、F已经穷尽了I1的所有可能子类型,满足密封类型switch的穷尽性要求。

内容的提问来源于stack exchange,提问作者twwwt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:16:06