使用两个接口声明变量

时间:2013-12-07 21:34:36

标签: java class oop interface hierarchy

是否有一些“最佳实践”如何声明实现两个接口的变量?

假设您的方法需要一个对象同时实现InterfaceAInterfaceB

void doSomething( BOTH_INTERFACES argument) {
...
}

您认为实现或模拟此方法的最佳方式是什么?


我想过创建一个组合界面

interface InterfaceAB extends InterfaceA, InterfaceB {}

但我可以将以下对象投射到它吗?

class SomeObject implements InterfaceA, InterfaceB {}

其他想法:

我可以这样做:

void doSomething( Object argument) {
    if(!(argument instanceof InterfaceA) || !(argument instanceof InterfaceB)) {
        throw new IllegalArgumentException();
    }
    InterfaceA faceA = (InterfaceA) argument;
    InterfaceB faceB = (InterfaceB) argument;
    // do some stuff with it
}

或许这种可怕:

void doSomething( InterfaceA faceA, InterfaceB faceB) {
    if(faceA != faceB) {
        throw new IllegalArgumentException();
    }

    // do some stuff with it
}

你会建议什么,你用什么/认为最好?

2 个答案:

答案 0 :(得分:4)

你会做

interface InterfaceAB extends InterfaceA, InterfaceB {}

并实施

class SomeObject implements InterfaceAB {}

实际上,如果你有很多子类型,你通常会有一个抽象类来存储一些常用代码。所以你会:

class AInterfaceAB implements InterfaceA, InterfaceB {}

因此,如果您想跳过容器接口,可以使用摘要。它不是超级优雅,但实用且没有真正的缺点,除了不使用界面。

不同的方法:你可以使用generics多个上限:

<T extends InterfaceA&InterfaceB> void doSomething(T argument) {
}

答案 1 :(得分:2)

这个怎么样:

InterfaceA extends BaseAB

InterfaceB extends BaseAB

BaseAB是EMPTY方法或常用方法的接口。

您可以在以下功能中使用BaseAB:

void doSomething( BaseAB argument) {

      if (argument instanceof InterfaceA )
      { }
      else
      {}
}