significa che solo il metodo è generico e consente alla classe di non essere generica (o utilizzare un parametro generico diverso dalla classe)
ad esempio la Collezione toArray metodo ha un parametro, questo permetterà al tipo di matrice di essere diverso dal tipo della collezione, (utile quando il tipo di raccolta è complicato)
le parentesi angolari devono rimanere retrocompatibili con la sintassi esistente (pre 1.5), che lo utilizzava solo per il confronto (ed è ingannato dal C ++ dove hanno affrontato lo stesso problema relativo alla compatibilità con il codice esistente) e in questo modo più vecchio i compilatori soffocheranno esattamente sulla sintassi, che indicherà esattamente dove si trova il problema
quindi scelgono deliberatamente la sintassi perché non è stata utilizzata da nessun'altra parte nella lingua
la posizione nella dichiarazione prima del tipo restituito è quella di non confondere il compilatore quando viene utilizzato un tipo non elaborato (come public List <T> foo(T t)
un metodo che restituisce List<T>
o un metodo generico che restituisce un grezzo List
)
la sintassi di chiamata Class.<T>foo()
è ancora una volta per evitare di confondere il compilatore; il <
dopo .
può significare solo l'inizio di un qualificatore generico, mentre mettendolo dopo il nome del metodo può essere ambiguo:
è foo(MyClass.bar<T,Y>(ab))
che chiama un singolo parametro foo usando il tipo di ritorno di MyClass.bar<T,Y>
o un foo che prende 2 booleani, devi sapere se MyClass.bar è un campo o un metodo