Java中如何将继承限制为单个子类

Sai*_*nth 14 java

假设有一个类A是父类和B扩展类A。

现在我不应该允许将类扩展A到类C( class C extends A) 或任何其他类。

怎么做?

Ars*_*der 26

这就是 Java 17 具有密封类的原因。此功能作为预览功能添加到 Java 15 中。

密封类和接口限制其他类或接口可以扩展或实现它们。

根据您的情况,您可以执行以下操作:-

public sealed class A permits B {

}

public class B extends A{ //No error

}

public class C extends A{  //error because class C is not permitted 

}
Run Code Online (Sandbox Code Playgroud)

Java 中密封类的目标是:-

  • 允许类或接口的作者控制哪些代码负责实现它。

  • 提供比访问修饰符更具声明性的方式来限制超类的使用。

  • 通过为模式的详尽分析提供基础,支持模式匹配的未来方向。


如果您想要一个不可扩展的类,那么您可以使用final.

public final class A{ //Cannot be extended by other classes.
}
Run Code Online (Sandbox Code Playgroud)

有用的网址:

https://docs.oracle.com/en/java/javase/15/language/sealed-classes-and-interfaces.html

http://openjdk.java.net/jeps/409

https://www.baeldung.com/java-sealed-classes-interfaces

Java 17 中的密封类是什么

  • 不,他们是15年的新人。 (3认同)

kay*_*ya3 5

如果您使用的是旧版本的 Java,自然的解决方案就是将类设为A包私有。这可以防止包外部的类A直接子类化。

如果A本身确实需要公开暴露,仍然有一个解决方案:声明另一个PublicA公共且最终的类,其中PublicA是 的子类,A没有附加或重写的成员。然后其他包中的类可以使用PublicA代替A,但它们不能子类化它。

PublicA和之间唯一的实际区别A是,该类B是 的子类A,但不是 的子类PublicA;例如,obj instanceof PublicA无法检测 的实例B或其他公共子类A。如果instanceof其他包中可能需要这样的检查,则可以公开实现的公共接口A,或者可以公开从包内部PublicA返回的静态方法(在允许的情况下)。arg instanceof A