gpt4 book ai didi

java - 保护 "default"方法不被覆盖

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:53 25 4
gpt4 key购买 nike

我正在寻找一种解决方案,它可以保护默认方法不被继承。最简单的解决方案可能是 - 从类等扩展......但在我的情况下这是不可能的。

有人可以建议如何解决这个问题吗?是否有任何解决方法?

Atm 我有以下代码,需要重新编写(如果/可能的话):

public interface MyInterface1 {
default boolean isA(Object obj) {
return (boolean) obj.equals("A") ? true : false;
}

default boolean isB(Object obj) {
return (boolean) obj.equals("B") ? true : false;
}
}

public class MyClass extends MyLogic implements MyInterface, MyInterface1 {
// this class allows to inherit methods from both interfaces,
// but from my perspective i'd like to use the methods from MyInterface1 as it is,
// with a 'protection' from inheritance. is that possible?
}

最佳答案

你似乎想要一种方法来编写你的接口(interface),以便实现类不能提供它们自己的默认方法的实现。没有办法做到这一点,而且它确实违背了一般接口(interface)的目的,尤其是默认成员。

默认方法的要点是提供一种向现有接口(interface)添加方法的方法,而不会立即破坏所有现有接口(interface)的实现。一般来说,这是一个二进制兼容性问题,而不是功能问题。通常没有特别的理由假设默认实现可以提供预期的功能,但如果没有它们,即使是根本不依赖新方法的旧代码也与添加方法的接口(interface)修订版不兼容。


我认为您遇到了保理问题。与其试图强制类提供特定方法的特定实现——它甚至不能引用该类的成员,除了可能由同一接口(interface)定义的其他成员——你应该在它们自己的类中提供通用方法。毕竟,由于您希望涉及的所有类都提供相同的实现,因此您实际使用哪个类的实现并不重要。此外,因此将任何给定类标记为提供众所周知方法的实现并没有特别的用处。

例子:

public class MyImplementation1 {
public static boolean isA(Object obj) {
return obj.equals("A");
}

public static isB(Object obj) {
return obj.equals("B");
}
}

// Wherever needed, use as MyImplementation1.isA(o), etc.

即使您希望这些预先烘焙的实现根据您接口(interface)的其他方法进行操作,您也可以这样做。在这种情况下,只需向提供要操作的对象的固定方法添加一个参数。也许这就是您示例中的 obj 参数应该是什么;在那种情况下,这可能更接近您所追求的:

public interface MyInterface3 {
public String someInterfaceMethod();
}

public class MyImplementation2 {

public static boolean isA(MyInterface3 subject) {
return subject.someInterfaceMethod().equals("A");
}

public static boolean isB(MyInterface3 subject) {
return subject.someInterfaceMethod().equals("B");
}
}

关于java - 保护 "default"方法不被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41556832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com