受保护的超级接口?

时间:2016-04-16 04:46:03

标签: java

如何使interface仅作为其他接口(非常类似于抽象类)的超级接口保护,以便只在我在同一个包中创建的接口可以扩展它,以便没有类可以实现它吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

虽然这是一个非常古老的问题,但它看起来像是 Java 15 和 Java 16 预览功能,密封接口,可能会提供与您正在寻求的功能接近的功能.请参阅 this Oracle documentation on "Sealed Classes" 中标题为“定义密封接口”的部分:

<块引用>

...要密封接口,请在其声明中添加密封修饰符。 然后,在任何 extends 子句之后,添加 permit 子句,其中 指定可以实现密封接口的类和 可以扩展密封接口的接口。

这种方法为您提出的类似于 protected 接口的提议提供了更精细的替代方案。对可扩展接口使用新的 sealed 关键字,并使用新的 permits 关键字显式命名允许扩展接口的接口。这些接口必须与 sealed 接口在同一个包或模块中。

新语法直观明了。这是 Oracle 的示例代码,它在 Eclipse 2021-03 中运行良好 with preview enabled

public class TestExpressions {
    public static void main(String[] args) {
        // (6 + 7) * -8
        System.out.println(
                new TimesExpr(new PlusExpr(new ConstantExpr(6), new ConstantExpr(7)), new NegExpr(new ConstantExpr(8)))
                        .eval());
    }
}

sealed interface Expr permits ConstantExpr,PlusExpr,TimesExpr,NegExpr {
    public int eval();
}

final class ConstantExpr implements Expr {
    int i;

    ConstantExpr(int i) {
        this.i = i;
    }

    public int eval() {
        return i;
    }
}

final class PlusExpr implements Expr {
    Expr a, b;

    PlusExpr(Expr a, Expr b) {
        this.a = a;
        this.b = b;
    }

    public int eval() {
        return a.eval() + b.eval();
    }
}

final class TimesExpr implements Expr {
    Expr a, b;

    TimesExpr(Expr a, Expr b) {
        this.a = a;
        this.b = b;
    }

    public int eval() {
        return a.eval() * b.eval();
    }
}

final class NegExpr implements Expr {
    Expr e;

    NegExpr(Expr e) {
        this.e = e;
    }

    public int eval() {
        return -e.eval();
    }
}

请注意,密封接口目前只是一个预览功能,因此在未来的 JDK 版本中可能会被修改或删除。