Java Language Utilisation de génériques pour la diffusion automatique


Exemple

Avec les génériques, il est possible de renvoyer tout ce que l'appelant attend:

private Map<String, Object> data;
public <T> T get(String key) {
    return (T) data.get(key);
}

La méthode compilera avec un avertissement. Le code est en fait plus sûr qu'il n'y paraît, car le runtime Java effectuera un transtypage lorsque vous l'utiliserez:

Bar bar = foo.get("bar");

C'est moins sûr quand vous utilisez des types génériques:

List<Bar> bars = foo.get("bars");

Ici, la distribution fonctionnera lorsque le type renvoyé est un type quelconque de List (c’est-à-dire que le retour de List<String> ne déclenche pas une ClassCastException ; vous l’obtiendrez éventuellement lors de la sortie d’éléments de la liste).

Pour contourner ce problème, vous pouvez créer une API qui utilise des clés tapées:

public final static Key<List<Bar>> BARS = new Key<>("BARS");

avec cette méthode put() :

public <T> T put(Key<T> key, T value);

Avec cette approche, vous ne pouvez pas insérer le mauvais type dans la carte, le résultat sera donc toujours correct (à moins que vous ne créiez accidentellement deux clés portant le même nom mais des types différents).

En relation: