Método que acepta dos tipos diferentes como parámetro

Estoy escribiendo un método que debería aceptar como parámetro un objeto de uno de dos tipos que no comparte un tipo principal que no sea Objeto. Por ejemplo, los tipos son los sueños y el ajo. Puedes hacer ambas cosasdreams.crush() ygarlic.crush(). Quiero tener un metodoutterlyDestroy(parameter), que aceptaría como parámetro tanto los sueños como el ajo.

utterlyDestroy(parameter) {
    parameter.crush()
}

Tanto Ajo como los sueños son parte de alguna biblioteca, por lo tanto, pídales que implementen una interfaz compatible con ICrushable (para que yo pueda escribirutterlyDestroy(ICrushable parameter) ) no es una opinión.

Mi cuerpo de método es bastante largo, por lo que sobrecargarlo significaría duplicar código. Feo. Estoy seguro de que podría usar la reflexión y hacer piratería de clase. Feo.

Intenté usar genéricos pero aparentemente no puedo escribir algo como

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

¿Es posible encasillar Garlic to Dreams?

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

Sin embargo, esto todavía sería feo. ¿Cuáles son mis otras opciones y cuál es el método preferido para enfrentar la situación?

Respuestas a la pregunta(8)

Su respuesta a la pregunta