java - 使用两个接口(interface)声明变量

标签 java class oop interface hierarchy

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

假设您的方法需要一个对象来同时实现 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
}

您有什么建议,您使用/认为最好的是什么?

最佳答案

你会做

interface InterfaceAB extends InterfaceA, InterfaceB {}

以及实现

class SomeObject implements InterfaceAB {}

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

class AInterfaceAB implements InterfaceA, InterfaceB {}

所以如果你想跳过容器接口(interface),你可以使用抽象。它不是 super 优雅,但很实用,除了不使用界面外没有真正的缺点。

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

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

关于java - 使用两个接口(interface)声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446952/

相关文章:

php - 当闭包和反射可用时,PHP 中的 OOP 可见性有什么意义?

iphone - ScrollView 的 subview 大小为零,即使加载的文本不是零

c# - 调用基类的方法

java - 我应该为 Flex + Java 开发投资 GraniteDS 吗?

java - GAE 中的 userservicefactory 是否仅适用于拥有 g-mail 帐户的用户?

c++ - 无法重载 + 运算符来添加 2 个对象

c++ - 为什么不能设置* this ==类对象

java - 需要有关概念 "Do Not Repeat Yourself"编码实践的建议

java - 通过在java中保持行跟踪来读取文件

java - GWT 无法从 servlet 检索结果