Je reçois l'avertissement:
[non coché] Pollution du tas possible de la classe de type vararg paramétré p> blockQuote>
Mais je ne suis pas sûr si cela polluera réellement: p>
xxx pré> Voici la mise en œuvre complète si cela est nécessaire: P>
public class EventDispatcher { public static ConcurrentLinkedQueue<Event> eventQueue; public static ConcurrentHashMap<Class<? extends Event>, CopyOnWriteArrayList<EventListener>> eventsListenerMap = new ConcurrentHashMap<>(); public static void register(EventListener listener, Class<? extends Event>... eventTypes) { for (Class<? extends Event> eventType : eventTypes) { if (eventsListenerMap.containsKey(eventType)) { eventsListenerMap.get(eventType).addIfAbsent(listener); } else { CopyOnWriteArrayList<EventListener> initializingListeners = new CopyOnWriteArrayList<>(); initializingListeners.add(listener); eventsListenerMap.put(eventType, initializingListeners); } } } }
3 Réponses :
Vous devez prendre soin de ce que l'organisme de la méthode de l'enregistrement ne jette pas ClasscastException au moment de l'exécution en raison d'arguments illégaux. Si vous êtes sûr qu'il est manipulé que vous pouvez ignorer ou supprimer en toute sécurité l'avertissement. P>
-1: Cela n'a rien à voir avec les arguments qui sont passés, mais avec la manière dont la méthode traite son paramètre Varargs.
L'avertissement au sujet varargs générique est lié à la dangers de tableaux génériques . En théorie, la méthode pourrait abuser de covariance de tableau avec le passé dans le tableau à cause de la pollution de tas, par exemple:
Class<?>[] eventTypesWithWidenedType = eventTypes; eventTypesWithWidenedType[0] = String.class; Class<? extends Event> eventType = eventTypes[0]; // liar!
eventTypes code>. Li>
- Ne pas retourner ou autrement exposer
eventTypes code> en dehors de la méthode. Li>
Ul> Avec Java 7, vous pouvez annoter la méthode avec @ SafeVarargs , qui promet essentiellement le compilateur que les tableaux génériques sont d'accord (ce qui signifie qu'il est plus sur l'appelant pour supprimer l'avertissement). p> p>
L'exemple basé sur mon code a indiqué clairement ce que sont les pièges. Les précautions suggérées m'aident à empêcher les erreurs et que l'annotation nettoie l'IDE. Tout cela avec des liens utiles. Superbe réponse compacte, merci.
Chaque fois que vous avez varargs qui sont genericized (par exemple, une liste genericized) vous avez une possibilité de pollution tas. Par exemple:
public static void register(EventListener listener, Class<? extends Event>... eventTypes) { Object[] objectArray = eventTypes; objectArray[0] = String.class; //Heap pollution ... ... }