有没有办法避免类在Java中同时实现2个特定接口?
例如,如果我有两种对象:Movable
个对象和Motionless
个对象。然后我有一个实现Car
的类Movable
。如果Motionless
已经实现了Movable
,我怎么能避免它实现?{/ p>
这只是一个简单的例子,显而易见的是,我可以移动的对象不能一动不动,但是可能存在一个对象不能同时实现2个特定接口的情况,从逻辑的角度来看。
答案 0 :(得分:1)
从广义上讲,它取决于接口的实现者来满足其合同 - 接口没有办法强制执行 - 如果两个接口有互斥合同,那么实现者应该认识到在试图满足合同时。
在某些情况下,在Javadoc中值得一提;例如,java.util.Set的Javadoc提到它的规范'等于'与java.util.List的相互排斥。
答案 1 :(得分:1)
您可以通过让每个接口声明一个具有不兼容的返回类型的方法来完成此操作。
E.g。一个界面可以声明void
方法someMethod
,另一个可以将其声明为int
类型。
如果你创建它们default
那么实现类就不必直接实现它们了,并且类没有办法成功实现它们。
e.g。
public interface A {
default void someMethod() {}
}
public interface B {
default int someMethod() {
return 0;
}
}
public class Test implements A, B
{
// Can't make this work since we cannot successfully override
// both default methods due to the different return types.
@Override
public void someMethod()
{
// TODO Auto-generated method stub
A.super.someMethod();
}
}
答案 2 :(得分:0)
你不能这样做。您可以执行以下操作之一
Movable
和Motionless
抽象类。Movable
和Motionless
打包私有,并将它们放在不同的包中。但这会强制它们的所有实现都在同一个包中。答案 3 :(得分:0)
在Java中没有办法强迫它。
您可以通过更改API来使用抽象类而不是接口来强制执行相同的操作:
abstract class Movable{}
abstract class Motionless{}
一次只能继承其中一个。
答案 4 :(得分:0)
作为其他答案,你不能用Java做到这一点。因为每个方法都有一个签名,所以你有两个相同的签名,这就是它会抛出编译错误的原因。 查看Method Signiature
的文档