2017-10-20 24 views
1

Pour la méthode getFirstFromEnum ci-dessous, il est toujours vrai que le type enum renvoyé est la classe transmise en tant qu'argument. Considérant cela, est-ce que de toute façon je pourrais changer la méthode pour éviter de lancer à chaque fois que je l'appelle?Comment éviter le cast avec des valeurs de retour génériques?

private <E extends Enum<?>> Enum<?> getFirstFromEnum(Class<E> enumClass) { 
    return enumClass.getEnumConstants()[0]; 
} 

EnumA foo = (EnumA) getFirstFromEnum(EnumA.class); //can I change method to avoid casting? 

Répondre

5

En fait, vous renvoyez Enum<?>.
Ce que vous voulez renvoyer est la valeur Enum de l'enum passé comme argument.
Par conséquent, spécifiez E comme valeur de retour car elle représente le type spécifique Enum que vous avez transmis.

Vous pouvez donc écrire:

private <E extends Enum<?>> E getFirstFromEnum(Class<E> enumClass) { 
    return enumClass.getEnumConstants()[0]; 
} 
+0

Pourriez-vous essayer de me expliquer la nécessité de remplacer '>' 'avec >'. Ils semblent tous deux travailler – user2651804

+0

Hmmm .. Honnêtement, je ne sais pas. J'ai l'habitude de taper autant que possible. Mais vous avez raison: ici, ce n'est pas nécessaire. Cela ressemble à du sucre syntaxique. J'ai mis à jour pour garder cette partie comme elle était. – davidxxx

+0

@ user2651804: ceci se résume à la question de savoir pourquoi 'java.lang.Enum' a été défini comme' Enum > 'au lieu de' Enum > 'ou simplement' Enum '. Au premier coup d'œil, il semble y avoir une certaine importance, mais en réalité, cela fonctionnerait parfaitement sans. Comme démontré par 'java.lang.Comparable' qui a été défini comme' Comparable 'au lieu de' Comparable > '... – Holger