扩展类y(实现接口z)的java类x是否也应该实现接口z

扩展类y(实现接口z)的java类x是否也应该实现接口z,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我有一个接口z。它是由类y实现的。我还有一个类x继承了类y。由于y实现了类z指定的约定,因此x也实现了相同的约定,因为它扩展了类y。因此,它是否也应该实现接口z 否。如果接口是在当前类的层次结构中的某个地方实现的,那么这就足够了 最后,接口只定义了类应该包含的几个方法。对于您的子类来说,这与它是来自顶级类的“普通”方法没有什么不同 样本: public class Main { public static void main(String[] args) { new X(

我有一个接口z。它是由类y实现的。我还有一个类x继承了类y。由于y实现了类z指定的约定,因此x也实现了相同的约定,因为它扩展了类y。因此,它是否也应该实现接口z

否。如果接口是在当前类的层次结构中的某个地方实现的,那么这就足够了

最后,接口只定义了类应该包含的几个方法。对于您的子类来说,这与它是来自顶级类的“普通”方法没有什么不同

样本:

public class Main {
    public static void main(String[] args) {
        new X().test();
        new Y().test();
    }
}

class X extends Y{

}

class Y implements Z{
    @Override
    public void test() {
        System.out.println("in Y");
    }
}

interface Z {
    public void test();
}
这将只是输出

在Y中
在Y

如果我们将
X
的定义更改为

class X extends Y implements Z
然后代码仍然可以编译,没有问题,输出保持不变


但是,如果我们在
X
中实现这个方法,那么我们将对
Y
隐藏这个方法的实现,你可以在java.util.*中找到很多这样的例子,例如List->ArrayList->RoleList

我相信X.isAssignableFrom(z)将是false,除非X在它的声明中显式实现z。(即使超类实现了z)。

这是一种公认的软件实践,还是说这没有什么区别?我不知道这是否是一种公认的实践,但如果是,就没有意义了。您可以使用相同的代码(包括
@Override
注释)从基类重写该方法。我不熟悉该方法及其用途它用于反射以确定对象是否满足指定的接口。示例帐户实现Debitable接口(其中包含debit()方法)。CheckingAccount扩展帐户。在调用checkingAccount对象上的debit()方法之前,用户可以通过询问checkingAccount.getClass().isAssignableFrom(Debitable.class)来测试该对象是否可借记。这是不正确的
isAssignableFrom()
完成了与
instanceof
相同的任务,Z的引用变量当然可以在OP的示例中保存X类型的对象,而不管X是否显式实现Z。实际上isAssignableFrom()当接口作为参数传递时,类和超类都返回false,这是我的错误。但是,从反射的角度来看,仍然存在差异。这个代码片段说明了这一点。CheckingAccount CheckingAccount=新的CheckingAccount();账户=新账户();System.out.println(“检查可从debtable分配的帐户:+Arrays.asList(checkingAccount.getClass().getInterfaces()).contains(debtable.class));System.out.println(“可从debtable分配的帐户:+Arrays.asList(Account.getClass().getInterfaces())。contains(debtable.class));