Type Erasure and Overloading in Java: ¿Por qué funciona esto?

Tengo el siguiente código

public class Pair< T, U > {
    public T first;
    public U second;
}
public class Test {
    public int method( Pair< Integer, Integer > pair ) {
        return 0;
    }
    public double method( Pair< Double, Double > pair ) {
        return 1.0;
    }
}

Esto realmente compila y funciona como cabría esperar. Pero si los tipos de retorno son iguales, esto no se compila, con el esperado "choque de nombres: método (Par) y método (Par) tienen el mismo borrado"

Dado que el tipo de retorno no es parte de la firma del método, ¿cómo es posible esta sobrecarga?

Respuestas a la pregunta(4)

Su respuesta a la pregunta