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

标签 java generics polymorphism overloading

我正在编写一个方法,它应该接受两个类型之一的对象作为其参数,这两种类型的对象除了 Object 之外不共享父类型。例如,类型是 Dreams 和 Garlic。 dreams.crush()garlic.crush() 都可以。我想要一个方法 utterlyDestroy(parameter),它可以接受 Dreams 和 Garlic 作为其参数。

utterlyDestroy(parameter) {
    parameter.crush()
}

Garlic 和 Dreams 都是某个库的一部分,因此不能让它们实现接口(interface) 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 接口(interface),但对于现有的类,参数被包装在 ICrushable 中并传递给完成所有工作的 utterlyDestroy(ICrushable)。

关于java - 接受两种不同类型作为参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777384/

相关文章:

python - 在 boost.python 中使用它时不能在我的抽象类中使用纯虚函数

Java KeyListener 事件循环直到释放键

java - Jboss Java Date 夏令时

java - 生成 JavaDocs?

c# - 不同属性的通用 foreach 循环

Python:询问两个对象是否是同一个类

java - 在Web服务器上使用php脚本执行java文件

java - 使用泛型方法替代重载?

java - 为什么我不能在这段代码中使用 Collections.max() 函数? - java

python - Python 中的多态性