Sobrecarga en Java y despacho múltiple

Tengo una colección (o lista o lista de matriz) en la que quiero poner valores de cadena y valores dobles. Decidí convertirlo en una colección de objetos y usar sobrecarga y polimorfismo, pero hice algo mal.

Realizo una pequeña prueba:

public class OOP {
    void prova(Object o){
        System.out.println("object");
    }

    void prova(Integer i){
    System.out.println("integer");
    }

    void prova(String s){
        System.out.println("string");
    }

    void test(){
        Object o = new String("  ");
        this.prova(o); // Prints 'object'!!! Why?!?!?
    }

    public static void main(String[] args) {
        OOP oop = new OOP();
        oop.test(); // Prints 'object'!!! Why?!?!?
    }
}

En la prueba parece que el tipo de argumento se decide en tiempo de compilación y no en tiempo de ejecución. ¿Porqué es eso

Esta pregunta está relacionada con:

Polymorphism vs Overriding vs Overloading
Intenta describir el polimorfismo tan fácil como puedas

EDITAR

Ok, el método a llamar se decide en tiempo de compilación. ¿Hay alguna solución alternativa para evitar el uso deinstanceof operador?

Respuestas a la pregunta(12)

Su respuesta a la pregunta