La spécification du langage Java 10 (3.2 Lexical Translations) indique :
La traduction la plus longue possible est utilisée à chaque étape, même si le résultat ne permet pas d'obtenir un programme correct alors qu'une autre traduction lexicale le ferait. Il existe une exception : si la traduction lexicale a lieu dans un contexte de type (§4.11) et que le flux d'entrée comporte deux caractères > consécutifs ou plus suivis d'un caractère non->, alors chaque caractère > doit être traduit par le token de l'opérateur de comparaison numérique >.
Les caractères d'entrée a--b sont transcrits (§3.5) sous la forme suivante a, --, b qui ne fait partie d'aucun programme grammaticalement correct, même si la tokénisation a, -, -, b pourrait faire partie d'un programme grammaticalement correct.
Sans la règle pour les caractères >, deux > parenthèses consécutives dans un type tel que List<List<String>>
serait considéré comme l'opérateur de décalage vers la droite signé >>, tandis que trois parenthèses > consécutives dans un type tel que List<List<List<String>>>
serait symbolisé par l'opérateur de décalage droit non signé >>>. Pire encore, la tokénisation de quatre parenthèses > consécutives ou plus dans un type tel que List<List<List<List<String>>>>
serait ambiguë, car diverses combinaisons de jetons >, >> et >>> pourraient représenter les caractères >>>>.
Les versions antérieures du C++ ont apparemment souffert de ce problème et ont donc exigé au moins un espace blanc entre les deux symboles adjacents inférieur à (<) et supérieur à (>), par exemple vector <vector<int> >
. Heureusement, ce n'est plus le cas.