162 votes

Pourquoi Java n'autorise-t-il pas les sous-classes génériques de Throwable ?

Selon le Séparation du langage Java 3ème édition :

C'est une erreur de compilation si une classe générique est une sous-classe directe ou indirecte de Throwable .

Je souhaite comprendre pourquoi cette décision a été prise. Quel est le problème avec les exceptions génériques ?

(Pour autant que je sache, les génériques sont simplement du sucre syntaxique à la compilation, et ils seront traduits en Object de toute façon dans le .class Ainsi, déclarer une classe générique revient à dire que tout ce qu'elle contient est un fichier Object . Veuillez me corriger si je me trompe).

2 votes

Les arguments de type générique sont remplacés par la borne supérieure, qui par défaut est Object. Si vous avez quelque chose comme List< ? extends A>, alors A est utilisé dans les fichiers de classe.

0 votes

Merci @Torsten. Je n'avais pas pensé à ce cas de figure auparavant.

2 votes

C'est une bonne question d'entretien, celle-là.

1voto

AAAlex123 Points 322

Non trop en rapport avec la question mais si vous voulez vraiment avoir une inner class qui étend un Throwable vous pouvez le déclarer static . Ceci est applicable lorsque le Throwable est logiquement lié à la classe englobante mais pas au type générique spécifique de cette classe englobante. En le déclarant static il n'est pas lié à une instance de la classe englobante et le problème disparaît.

L'exemple suivant (qui n'est pas très bon, il faut bien l'avouer) l'illustre bien :

/** A map for <String, V> pairs where the Vs must be strictly increasing */
public class IncreasingPairs<V extends Comparable<V>> {

    private final Map<String, V> map;

    public IncreasingPairs() {
        map = new HashMap<>();
    }

    public void insertPair(String newKey, V value) {
        // ensure new value is bigger than every value already in the map
        for (String oldKey : map.keySet())
            if (!(value.compareTo(map.get(oldKey)) > 0))
                throw new InvalidPairException(newKey, oldKey);

        map.put(newKey, value);
    }

    /** Thrown when an invalid Pair is inserted */
    public static class InvalidPairException extends RuntimeException {

        /** Constructs the Exception, independent of V! */
        public InvalidPairException(String newKey, String oldKey) {
            super(String.format("Value with key %s is not bigger than the value associated with existing key %s",
                    newKey, oldKey));
        }
    }
}

Pour en savoir plus : docs.oracle.com

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X