我正在编写一个方法,该方法应该接受两种类型之一的对象作为其参数,这两种类型的对象除了 Object 之外不共享父类型。例如,类型是 Dreams 和 Garlic。你可以同时做dreams.crush()
和garlic.crush()
。我想要一个方法utterlyDestroy(parameter)
,它可以接受 Dreams 和 Garlic 作为其参数。
utterlyDestroy(parameter) {
parameter.crush()
}
Garlic 和 Dreams 都是某个库的一部分,因此让它们实现接口 ICrushable(以便我可以编写utterlyDestroy(ICrushable parameter)
)不是一种选择。
我的方法体很长,所以重载意味着重复代码。丑陋的。我确信我可以使用反射并进行一些类黑客攻击。丑陋的。
我尝试使用泛型,但显然我不能写类似
utterlyDestroy(<T instanceof Dreams || T instanceof Garlic> parameter)
是否可以将 Garlic 类型转换为 Dreams?
utterlyDestroy(Object parameter) {
((Dreams)parameter).crush()
}
不过,这仍然很丑陋。我的其他选择是什么?处理这种情况的首选方法是什么?
这个怎么样:
interface ICrushable { void crush(); } utterlyDestroy(ICrushable parameter) { // Very long crushing process goes here parameter.crush() } utterlyDestroy(Dreams parameter) { utterlyDestroy(new ICrushable() { crush() {parameter.crush();}); } utterlyDestroy(Garlic parameter) { utterlyDestroy(new ICrushable() { crush() {parameter.crush();}); }
新开发应该实现 ICrushable 接口,但对于现有的类,参数包装在 ICrushable 中并传递给完成所有工作的 utterlyDestroy(ICrushable)。