Non può esistere una compatibilità generale fra i tipi parametrici. Se si è alla ricerca della compatibilità, bisogna prendere in considerazione casi specifici e tipi di parametri di singoli metodi. Quindi, alla normale notazione dei tipi generici List<T>, usata per creare oggetti, si affianca una nuova notazione, pensata per esprimere i tipi accettabili come parametri in singoli metodi.
Si parla quindi di tipi parametrici varianti, in [[Java (linguaggio)|Java]] detti '''wildcard'''.
Posto che la notazione ''List<T>'' denota il normale tipo generico, si introducono le seguenti '''notazioni wildcard''':
*tipo '''covariante''' ''List<extends T>'': cattura le proprietà dei ''List<X>'' in cui ''X'' estende ''T''; si usa per specificare tipi che possono essere solo letti.
*tipo '''controvariante''' ''List<super T>'': cattura le proprietà dei ''List<X>'' in cui ''X'' è esteso da ''T''; si usa per specificare tipi che possono essere solo scritti.
*tipo '''bivariante''' ''List<?>'': cattura tutti i ''List<T>'' senza distinzioni; si usa per specificare i tipi che ''non'' consentono né letture né scritture.