【问题标题】:How do I make a method accept instances with two interfaces? [duplicate]如何使方法接受具有两个接口的实例? [复制]
【发布时间】:2016-10-16 15:54:36
【问题描述】:

我有几个接口:

public interface Speaker {
    void speak();
}

public inteface Walker {
    void walk();
}

我想要一种方法,该方法采用SpeakerWalker 的实例。

现在,我可以实现另一个接口:

public interface WalkerSpeaker extends Walker, Speaker {

}

并接受:

void walkAndTalk(final WalkerSpeaker x) {
    x.walk();
    x.speak();
}

但这对于许多组合来说是相当麻烦的,并且每个实现都必须继承自 WalkerSpeaker 才能工作!

有没有更好的办法?

【问题讨论】:

  • 差不多就是这样。如果它变得很麻烦,你可能想看看你的设计。
  • @Ravindrababu 您对该链接的回答同样繁琐且高度僵化,无法轻松扩展或更改。
  • 仅供参考:最好使用implements 而不是extends 作为接口。
  • @Akunosh An interface 只能extend 母亲interface。只有类和枚举在指定接口时使用implements
  • @Akunosh 一个接口可以扩展一个或多个接口。一个类可以实现一个或多个接口和/或扩展一个类。

标签: java oop interface


【解决方案1】:

您可以使用泛型实现此目的,如下所示

public <T extends Speaker & Walker> void walkAndTalk(T x) {
    x.walk();
    x.speak();
}

类型参数T 对两个接口都是“双界”的,所以本质上T 将是WalkerSpeaker,除非您不必为它编写单独的接口。

【讨论】:

  • 由于泛型在编译时被删除,所以没有。这并不重要,因为性能是比一些随机方法调用更大的问题。
  • +1,这个解决方案的想法非常好,但我不喜欢可以在同一方法中以两种不同性质查看对象的想法。看来walkAndTalk方法的职责不止一个,所以就打破了Single Responsibility的原则。
  • @DavideLorenzoMARINO 它基本上是Mixin 的Java 版本,尤其是现在使用默认方法。但这只是一个例子,因此考虑它是否违反某些原则并不是很有用。
  • @Kayaman 是的,这是一个类似于 mixin 的实现。
  • @sdgfsdh:好吧,由于类型擦除,参数的擦除类型将是Speaker,并且在字节码级别插入一个转换为Walker的类型以调用walk()方法,但它不太可能注意到性能影响。 HotSpot 对性能关键代码所做的第一件事是将代码内联到调用者的上下文中,其中实现这两个接口的x 的实际类型是已知的。
猜你喜欢
  • 2019-08-19
  • 2011-07-06
  • 2013-12-01
  • 2020-12-09
  • 2022-01-22
  • 2017-08-16
  • 2015-03-11
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多