方法的参数 - 同时要求类和接口

时间:2016-08-12 17:40:39

标签: java

我有一个类Context。它需要被传递给另一个类的构造函数 - 比如说,管理器。但是上下文变量也必须是MyInterface的实现,它必须实现requiredMethod()。所以我想成为:

class Manager {
    Manager(Context context) {
        context.doSomeStandardContextStuff();
        if (context instanceof MyInterface) {
            context.requiredMethod()
        }
    }
}

但是,编译器和IDE告诉我无法解决requiredMethod()。

所以我有责任为了解决这个问题而创建一个人工的#34;另一个类,它从Context类扩展,并实现MyInterface - 只是为了在上面的构造函数中将它用作单个对象?或者有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

您可以使构造函数通用,并具有双重类型绑定:

<T extends Context & MyInterface> Manager(T context) {
    context.doSomeStandardContextStuff();
    context.requiredMethod();
}

这可以避免必须施放。

但是,您也可以指定实现类型。即:

class Implementation extends Context implements MyInterace {...}
Manager(Implementation i) {...}

或者,如果您有多个实现,请创建一个公共超类型:

abstract class Union extends Context implements MyInterface {}
class Implementation extends Union {...}
Manager(Union u) {...}

Union将是一个虚拟类,但仍然比通用版本更有效。

由于通用版本被删除以使Context作为参数,并且每次要从MyInterface调用方法时必须将其转换为MyInterface

答案 1 :(得分:2)

这将检查变量是否是运行时类型的实例:

$rooms

但是在编译时没有将变量解析为该类型。要做到这一点,你可以施展它:

if (context instanceof MyInterface)