如何使interface
仅作为其他接口(非常类似于抽象类)的超级接口保护,以便只在我在同一个包中创建的接口可以扩展它,以便没有类可以实现它吗?
谢谢。
答案 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 版本中可能会被修改或删除。