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
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à.
0 votes
@TorstenMarek : Si quelqu'un appelle
myList.get(i)
évidemmentget
renvoie toujours unObject
. Le compilateur insère-t-il un cast versA
afin de capturer une partie de la contrainte au moment de l'exécution ? Si ce n'est pas le cas, le PO a raison de dire qu'en fin de compte, tout se résume à ce qui suitObject
au moment de l'exécution. (Le fichier de classe contient certainement des métadonnées sur les éléments suivantsA
mais il ne s'agit que de métadonnées AFAIK).