Утиная печать - это всего лишь тонкая версия полиморфизма. В статически типизированном языке, таком как Java, вам нужно будет создать явный интерфейс, который сообщит компилятору все методы, которые может принимать конкретная переменная. В динамическом языке, таком как Ruby, интерфейсы все еще существуют в абстрактном смысле, они просто неявные.
Проблема в том, что вы принимаете две разные структуры данных в одном методе. Чтобы заставить утку набирать текст, нужно требовать, чтобы все объекты, которые передаются вашему методу, подчинялись одному и тому же контракту (т. Е. Это всегда хэш Integer для объектов [Foo].) Правильная структура должна быть заданием клиентского кода. Это можно сделать очень просто с помощью простого класса-обертки или функции преобразования, состоящей только из тела вашего предложения elseif.
Суть в том, что парень, вызывающий метод, должен убедиться, что все его параметры работают так, как ваш метод ожидает их. Если они этого не сделают, ему нужно выяснить, как сделать свою индюшатину крякать, как утку, а не вы.