作为一个具体的例子
sealed interface A permits B {
default void a() {
this.b();
}
}
non-sealed interface B extends A {
void b();
}我知道这不能编译,但从语言的角度来看,我不明白编译器/编译器实现者有什么理由不允许它。
发布于 2021-04-02 02:10:19
正如@sepp2k评论的那样,有一个显而易见的答案:b()不是A的成员。
你的直觉告诉你,"sum类型有点像联合类型“,”既然b()在联合'A=B or nothing‘中的所有已知类型的交集中,那么我们应该能够将b()视为A的成员“。除了“这不是它的工作方式”之外,想想这种“鸭子类型”对于B的变化,A的许可列表的变化等是多么脆弱,还有什么好的原因呢?
如果A想要表达一个约束,即它的所有子类都有一个方法b(),那么有一种长期存在的方法可以做到:然后A可以声明一个抽象的b()。在语言中为“只有一个子类的密封类”的情况引入这种复杂性将是非常愚蠢的,因为已经有了一种简单而安全的方法来做到这一点。“但我将不得不在A中再输入一行代码”不是希望有这种魔力的好理由。
https://stackoverflow.com/questions/66499539
复制相似问题