代码之家  ›  专栏  ›  技术社区  ›  Lapo pfalcon

有没有一种方法可以避免类同时实现两个特定的接口?

  •  1
  • Lapo pfalcon  · 技术社区  · 8 年前

    有没有办法避免一个类同时在Java中实现2个特定的接口?

    例如,如果我有两种对象: Movable 对象和 Motionless 物体。那我要上课了 Car 实现 可移动 . 我怎样才能避免它的实现 静止 如果它已经实现 可移动 ?

    这只是一个很普通的例子,很明显,我可以移动的对象不能静止,但在某些情况下,从逻辑的角度来看,一个对象不能同时实现两个特定的接口,这还不是很清楚。

    5 回复  |  直到 8 年前
        1
  •  1
  •   Trevor Freeman    8 年前

    您可以通过让每个接口声明具有不兼容返回类型的方法来实现这一点。

    例如,一个接口可以声明 void 方法 someMethod 另一个可以声明为类型 int .

    如果你做的话 default 这样,实现类就不必直接实现它们,而且类无法成功地实现这两者。

    例如

    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
  •  1
  •   ruakh    8 年前

    从广义上讲,一个接口的实现者必须满足它的契约——接口没有办法执行这个契约——如果两个接口有互斥的契约,那么实现者应该在试图满足契约的同时认识到这一点。

    在某些情况下,可以在javadoc中提到这一点;例如,javadoc for java.util.set提到它的“equals”规范与java.util.list的规范相互排斥。

        3
  •  0
  •   Thiyagu    8 年前

    你不能这样做。您可以执行以下操作之一

    1. 制作 Movable Motionless 抽象类。
    2. 制作 可移动 静止 将它们打包并放在不同的包中。但这将迫使它们的所有实现都在同一个包中。
        4
  •  0
  •   ernest_k Petronella    8 年前

    在Java中没有强制的方法。

    通过将API更改为使用抽象类而不是接口,可以强制执行相同的操作:

    abstract class Movable{}
    abstract class Motionless{}
    

    一次只能继承其中的一个。

        5
  •  0
  •   Gatusko    8 年前

    作为其他答案,你不能在Java中这样做。因为每个方法都有一个签名,并且有了这个签名,就有了两个相同的签名,这就是为什么它会抛出编译错误的原因。 检查的文档 Method Signiature