在Java中指定多个接口的方法

我有两个接口, HasClickHandlersDoesFancyFeedback 。 然后我有一些实现两个接口的UI对象 – 例如,一个实现它们的Button都有点击处理程序,也做了花哨的反馈。

在我声明Button的代码中,我不想实际说Button因为可能以后我会想要它,我不知道,一个具有点击处理程序的Image并且做了花哨的反馈。 所以不是具体而是说:

 Button saveButton = aButtonIPassedIn; saveButton.addClickHandler(); saveButton.doFancyFeedback(); 

我想说,

 {HasClickHandlers + DoesFancyFeedback} clickyFeedbackThing = aThingIPassedIn; clickyFeedbackThing.addClickHandler(); clickyFeedbackThing.doFancyFeedback(); 

我希望编译器要求aThingIPassedIn实现HasClickHandlers DoesFancyFeedback

我可以创建一个扩展这两个接口的接口 ,并使用它。 有没有更简单/更简洁的方式?

我不认为有更好的方法来做你想要的。 我只是想建议你做以下事情。 您可以创建接受需要2个接口的参数的方法(让我们称之为foo):

  void foo(T arg); 

请注意2个接口之间的一个&符号。

您可以尝试使用generics:

 public < T extends HashClickHandlers & DoesFancyFeedback > void foo ( T aThingIPassedIn ) { aThingIPassedIn.addClickHandler( ); aThingIPassedIn.doFancyFeedback( ); } 

不,Java中没有这样的东西。

您必须使用您提到的创建第三个界面的选项。 这样你就可以明确地声明你打算使用新类型。

毕竟不是那么冗长(考虑替代方案),因为你只需键入:

 public interface FancyWithHandler extends HashClickHandlers , DoesFancyFeedback {} 

您不需要包含这些方法。 然后使用它:

 FancyWithHandler clickyFeedbackThing = aThingIPassedIn; clickyFeedbackThing.addClickHandler(); clickyFeedbackThing.doFancyFeedback(); 

虽然通用选项看起来很有趣,但最终你可能最终会创建一个更冗长的东西。

虽然那会很难看,但你可以把它变成一个对象并投射它。 对于调用方法,这将是最简单的方法。

我不希望Button实现任何这些接口。 您所描述的内容听起来更像是事件监听器的范畴。 最好让监听器实现简单和奇特的点击处理程序,并将监听器传递给Button或UI组件。 它更像是一个委托模型,它可以处理UI组件以及可以随意更改的单独类。