Il existe plusieurs niveaux d'égalité. Habituellement, ils sont désignés par des mots comme "égal" ou "équivalent". Ce que ces mots signifient exactement dépend du contexte, mais généralement l'égalité implique l'équivalence, mais pas l'inverse.
Par exemple, avec deux morceaux de code A et B, on pourrait dire que A et B sont égales si elles consistent exactement les mêmes caractères, et dire qu'ils sont équivalents si nous peut toujours remplacer A par B, et vice versa, sans changer le comportement du programme. Si nous faisons cela,
int i;
i = 10;
et
int i = 10;
ne sont pas égaux mais équivalent.
Les deux extraits de code de votre devis sont appelés "à peu près équivalents" par l'auteur. Le mot «grossièrement» suggère qu'ils ne sont pas du tout équivalents. Et en effet:
GenericStack stack = new GenericStack();
GenericStack<String> stack2 = stack;
compiles (avec un avertissement), alors que
GenericStack<Object> stack = new GenericStack<Object>();
GenericStack<String> stack2 = stack;
ne fonctionne pas. Ce que l'auteur veut dire par "à peu près équivalent" est que le type brut se comporte comme un GenericStack<Object>
dans de nombreux cas, mais pas dans tous. En particulier, vous pouvez y mettre n'importe quel objet.