Я экспериментирую с этим кодом:
interface Callee {
    public void foo(Object o);
    public void foo(String s);
    public void foo(Integer i);
}
class CalleeImpl implements Callee
    public void foo(Object o) {
        logger.debug("foo(Object o)");
    }
    public void foo(String s) {
        logger.debug("foo(\"" + s + "\")");
    }
    public void foo(Integer i) {
        logger.debug("foo(" + i + ")");
    }
}
Callee callee = new CalleeImpl();
Object i = new Integer(12);
Object s = "foobar";
Object o = new Object();
callee.foo(i);
callee.foo(s);
callee.foo(o);
Это печатает foo(Object o) три раза. Я ожидаю, что выбор метода учитывает реальный (не объявленный) тип параметра. Я что-то упускаю? Есть ли способ изменить этот код, чтобы он печатал foo(12), foo("foobar") и foo(Object o)?
