Método aceitando dois tipos diferentes como parâmetro

Eu estou escrevendo um método que deve aceitar como seu parâmetro um objeto de um dos dois tipos que não compartilham um tipo pai diferente de Object. Por exemplo, os tipos são Sonhos e Alho. Você pode fazer as duas coisasdreams.crush() egarlic.crush(). Eu quero ter um métodoutterlyDestroy(parameter), que aceitaria como parâmetro os sonhos e o alho.

utterlyDestroy(parameter) {
    parameter.crush()
}

Tanto o Alho quanto os sonhos fazem parte de alguma biblioteca, então eles implementam uma interface ICrushable (para que eu possa escreverutterlyDestroy(ICrushable parameter) ) não é uma opção.

Meu corpo do método é bastante longo, então sobrecarregar significaria duplicar o código. Feio. Eu tenho certeza que eu poderia usar reflexão e fazer alguns hacks de classe. Feio.

Eu tentei usar genéricos, mas aparentemente não posso escrever algo como

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

É possível fazer o typecast do Garlic to Dreams?

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

Isso ainda seria feio. Quais são minhas outras opções e qual é o método preferido para lidar com a situação?

questionAnswers(8)

yourAnswerToTheQuestion