如何使方法接受具有两个接口的实例?

sdg*_*sdh 23 java oop interface

我有几个接口:

public interface Speaker {
    void speak();
}

public inteface Walker {
    void walk();
}
Run Code Online (Sandbox Code Playgroud)

我想要一个带有a Speaker和a 实例的方法Walker.

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

public interface WalkerSpeaker extends Walker, Speaker {

}
Run Code Online (Sandbox Code Playgroud)

并接受:

void walkAndTalk(final WalkerSpeaker x) {
    x.walk();
    x.speak();
}
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的办法?

Kay*_*man 54

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

public <T extends Speaker & Walker> void walkAndTalk(T x) {
    x.walk();
    x.speak();
}
Run Code Online (Sandbox Code Playgroud)

type参数T对两个接口都是"双重限制",所以本质上T是a,WalkerSpeaker除了你不必为它编写一个单独的接口.

  • @sdgfsdh:很好,因为类型擦除,参数的擦除类型将是`Speaker`和类型转换为`Walker`在字节代码级插入调用`步行()`方法,但它不可能永远通知影响性能.第一件事情,热点确实为性能关键代码,是内联代码到调用方的背景下,在它实现了两个接口x`的`的实际类型是已知的. (6认同)
  • +1,这个解决方案很不错的想法,但我不喜欢这样一个对象可以有两个不同性质相同的方法来查看的想法.似乎walkAndTalk方法有多个责任,因此违反了单一责任原则. (5认同)
  • @DavideLorenzoMARINO这基本上是一个[密新]的Java版本(https://en.wikipedia.org/wiki/Mixin)特别是现在使用默认的方法.但这仅仅是一个例子,因此考虑它是否违反某些原则并不是很有用. (5认同)
  • 由于泛型在编译时被擦除,所以没有.这不是问题,因为性能比一些随机的方法调用一个更大的问题. (3认同)