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

2022-09-01 03:45:43

我正在编写一个方法,该方法应接受两种类型的对象之一作为其参数,这两种对象不共享Object以外的父类型。例如,类型是梦和大蒜。您可以同时执行 和 。我想要一个方法,可以接受Dreams和Garstic作为其参数。dreams.crush()garlic.crush()utterlyDestroy(parameter)

utterlyDestroy(parameter) {
    parameter.crush()
}

大蒜和梦都是某个库的一部分,所以让它们实现一个接口ICRable(这样我就可以写)不是一个选择。utterlyDestroy(ICrushable parameter)

我的方法体很长,所以重载它意味着重复代码。丑。我相信我可以使用反射并进行一些类黑客攻击。丑。

我尝试使用泛型,但显然我不能写这样的东西

utterlyDestroy(<T instanceof Dreams || T instanceof Garlic> parameter)

是否可以将大蒜类型化为梦想?

utterlyDestroy(Object parameter) {
    ((Dreams)parameter).crush()
}

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


答案 1

怎么样:

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


答案 2

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

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
    }
}

如果 太复杂和大,你只想调用,那么这做了你想要的。utterlyDestroycrush