接受两种不同类型作为参数的方法

新手上路,请多包涵

我正在编写一个方法,该方法应该接受两种类型之一的对象作为其参数,这两种类型不共享 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()
}

不过,这仍然很难看。我的其他选择是什么?处理这种情况的首选方法是什么?

原文由 JohnEye 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

这个怎么样:

 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)。

原文由 Devon_C_Miller 发布,翻译遵循 CC BY-SA 3.0 许可协议

像这样简单的事情怎么样?

 utterlyDestroy(Object parameter) {
    if (parameter instanceof Dreams) {
        Dreams dream = (Dreams) parameter;
        dream.crush();
        // Here you can use a Dream
    } else if (parameter instanceof Garlic) {
        Garlic garlic = (Garlic) parameter;
        garlic.crush();
        // Here you can use a Garlic
    }
}

…或者如果您使用的是 Java 14+:

 utterlyDestroy(Object parameter) {
    if (parameter instanceof Dreams dream) {
        dream.crush();
        // Here you can use a Dream
    } else if (parameter instanceof Garlic garlic) {
        garlic.crush();
        // Here you can use a Garlic
    }
}

如果 utterlyDestroy 过于复杂和庞大,而您只想调用 crush 那么这就是您想要的。

原文由 Cratylus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题