代码之家  ›  专栏  ›  技术社区  ›  Riley Lark

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

  •  13
  • Riley Lark  · 技术社区  · 15 年前

    我有两个接口, HasClickHandlers DoesFancyFeedback . 然后我有一些实现这两个接口的UI对象-例如, Button 它既实现了单击处理程序,也实现了奇特的反馈。

    在我的代码中声明 纽扣 S,我不想说 纽扣 因为也许以后我会想要它,我不知道,一个 Image 它有点击处理程序,并且有很好的反馈。所以,不要具体地说:

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

    我想说,

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

    我希望编译器要求 aThingIPassedIn 实现两者 具有单击处理程序 是否反馈 .

    我可以 创建扩展这两个接口的接口 然后用那个。有没有更简单/更详细的方法?

    5 回复  |  直到 15 年前
        1
  •  27
  •   AlexR    15 年前

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

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

    请注意两个接口之间的一个和号。

        2
  •  5
  •   L. Cornelius Dol    13 年前

    您可以尝试使用仿制药:

    public < T extends HashClickHandlers & DoesFancyFeedback > void foo (
            T aThingIPassedIn
        )
    {
        aThingIPassedIn.addClickHandler( );
        aThingIPassedIn.doFancyFeedback( );
    }
    
        3
  •  1
  •   L. Cornelius Dol    13 年前

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

    您必须使用您提到的创建第三个接口的选项。这样,您就可以明确地声明您使用新类型的意图。

    毕竟没有那么冗长(考虑到备选方案),因为您只需键入:

    public interface FancyWithHandler 
           extends HashClickHandlers , DoesFancyFeedback {} 
    

    你不需要包括这些方法。然后使用它:

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

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

        4
  •  0
  •   thejh    15 年前

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

        5
  •  -1
  •   duffymo    15 年前

    我不希望按钮实现这些接口中的任何一个。你所描述的听起来更像是事件监听者的职责范围。最好让监听器实现简单而奇特的单击处理程序,并将监听器传递到按钮或UI组件中。它更像是一个委托模型,它将处理过程保存在UI组件之外,并保存在单独的类中,您可以随意更改这些类。