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

时间:2010-11-26 22:28:11

标签: java inheritance interface

我有两个界面,HasClickHandlersDoesFancyFeedback。然后我有一些实现两个接口的UI对象 - 例如,实现它们的Button都有点击处理程序,并且也做了很好的反馈。

在我宣布Button的代码中,我不想实际说Button,因为也许以后我会希望它是,我不知道,Image点击处理程序并做出花哨的反馈。所以不是具体而是说:

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

我想说,

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

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

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

6 个答案:

答案 0 :(得分:27)

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

<T extends HasClickHandlers & DoesFancyFeedback> void foo(T arg);

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

答案 1 :(得分:5)

您可以尝试使用泛型:

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

答案 2 :(得分:1)

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

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

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

public interface FancyWithHandler 
       extends HashClickHandlers , DoesFancyFeedback {} 

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

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

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

答案 3 :(得分:1)

不需要第三个接口,也不需要其他方法。

Optional.ofNullable((HasClickHandlers & DoesFancyFeedback)clickyFeedbackThing).ifPresent(then -> {
    then.addClickHandler();
    then.doFancyFeedback();
});

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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