我有一个类Context。它需要被传递给另一个类的构造函数 - 比如说,管理器。但是上下文变量也必须是MyInterface的实现,它必须实现requiredMethod()。所以我想成为:
class Manager {
Manager(Context context) {
context.doSomeStandardContextStuff();
if (context instanceof MyInterface) {
context.requiredMethod()
}
}
}
但是,编译器和IDE告诉我无法解决requiredMethod()。
所以我有责任为了解决这个问题而创建一个人工的#34;另一个类,它从Context类扩展,并实现MyInterface - 只是为了在上面的构造函数中将它用作单个对象?或者有更好的解决方案吗?
答案 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)