Java:通过继承类实现接口

Java:通过继承类实现接口,java,inheritance,interface,casting,Java,Inheritance,Interface,Casting,适时问候:) 在Java中工作,我有一个接口A。该接口的所有实现者也扩展了类B,但B没有实现A。在我们使用A实例(引用为A)的类中,它被转换为B引用,以便我们可以使用在类B中定义的方法。从概念上讲,该方法也应该属于接口A 你能想出一个不将方法引入接口a的原因吗,这样我们就不必将它强制转换为B了?我是否应该重写子类中的方法,只调用超级版本,以便更容易在IDE等中导航?为什么不创建一个扩展B并实现A的抽象类?假设这个类将被称为C,您的其他类将扩展C并实现A所需的方法,但将为您提供B中可用的方法,而无

适时问候:)

在Java中工作,我有一个接口A。该接口的所有实现者也扩展了类B,但B没有实现A。在我们使用A实例(引用为A)的类中,它被转换为B引用,以便我们可以使用在类B中定义的方法。从概念上讲,该方法也应该属于接口A


你能想出一个不将方法引入接口a的原因吗,这样我们就不必将它强制转换为B了?我是否应该重写子类中的方法,只调用超级版本,以便更容易在IDE等中导航?

为什么不创建一个扩展B并实现A的抽象类?假设这个类将被称为C,您的其他类将扩展C并实现A所需的方法,但将为您提供B中可用的方法,而无需强制转换


我认为现在移动方法不是一个好主意,最多可能是让B实现a(假设您没有其他您没有提到的依赖于您提到的类和接口的类)。

为什么不创建一个扩展B并实现a的抽象类呢?假设这个类将被称为C,您的其他类将扩展C并实现A所需的方法,但将为您提供B中可用的方法,而无需强制转换

我认为现在移动方法不是一个好主意,最多可能是B实现了a(假设您没有其他您没有提到的依赖于您提到的类和接口的类)

在我们使用a实例(引用为a)的类中,它被强制转换为B引用,以便我们可以使用在类B中定义的方法

所以我假设你有这种情况

public void doStuff(A aType){
   ...
   B bType = (B) aType;
   ...
}
如果这是真的,这行得通吗

private <T extends B & A> void example(T type){
    type.aStuff();
    type.doBStuff();
}
给我

A stuff B stuff 东西 B类 在我们使用a实例(引用为a)的类中,它被强制转换为B引用,以便我们可以使用在类B中定义的方法

所以我假设你有这种情况

public void doStuff(A aType){
   ...
   B bType = (B) aType;
   ...
}
如果这是真的,这行得通吗

private <T extends B & A> void example(T type){
    type.aStuff();
    type.doBStuff();
}
给我

A stuff B stuff 东西
B Stuff为什么B不实现A?我不知道类实际上是什么,但听起来可以通过重新设计整个系统来解决。扔掉接口A,只使用类B。问题是为什么不将该方法引入A。答案是:在良好的OOP设计中,您通常希望有小接口,根据单一责任原则。如果您的接口定义的方法多于单个职责,请将其拆分为两个接口。为什么B不实现a?我不知道这些类实际上是什么,但听起来可以通过重新设计整个系统来解决。扔掉接口A,只使用类B。问题是为什么不将该方法引入A。答案是:在良好的OOP设计中,根据单一责任原则,您通常希望有小型接口。如果您的接口定义的方法多于单个职责的方法,请将其拆分为两个接口。a太大,太不同,B无法实现,但谢谢。我应该在示例中解释更多…A太大,太不同,B无法实现它,但谢谢。我应该在示例中解释更多…这可能会起作用。我不知道你能做到。但也许我们应该重新设计一下,因为它比需要的更复杂。到目前为止,我只是在界面中重复了这个方法。也许我会再看一眼,看看在a和B中使用它是否有真正的价值。实际上,我在子类中重写了该方法,只是为了调用super,因为如果在Eclipse中搜索在a中使用该方法,您将看不到使用B引用调用它的实例。那太糟糕了。这可能有用。我不知道你能做到。但也许我们应该重新设计一下,因为它比需要的更复杂。到目前为止,我只是在界面中重复了这个方法。也许我会再看一眼,看看在a和B中使用它是否有真正的价值。实际上,我在子类中重写了该方法,只是为了调用super,因为如果在Eclipse中搜索在a中使用该方法,您将看不到使用B引用调用它的实例。那太糟糕了。