Invocation De Méthodes Génériques De Java

Je suis des études en Java fonctionnalité générique et je ne suis pas sûr de savoir comment expliquer la troisième ligne dans la suite de main méthode:

public class Example4 {
    public static void main(final String[] args) {
        System.out.println(Util.<String>compare("a", "b"));
        System.out.println(Util.<String>compare(new String(""), new Long(1)));
        System.out.println(Util.compare(new String(""), new Long(1)));
    }
}

class Util {
    public static <T> boolean compare(T t1, T t2) {
        return t1.equals(t2);
    }
}

La première ligne compile, s'exécute et renvoie (comme prévu) false.

La deuxième ligne ne compile pas comme prévu, parce que je suis explicitement mélange String et Long.

La troisième ligne compile, s'exécute, et renvoie false mais je ne suis pas sûr de comprendre comment il arrive à travailler: le compilateur/JVM instancie le type de paramètre T comme Object? (D'ailleurs, y aurait-il un moyen d'obtenir ce type déclaré de T d'exécution?)

Merci.