6
votes

4 Réponses :


7
votes

Vous pouvez retourner nouveau hashset (Enumset.Allof (champs.class)); .

Cela se contentera du fait que vous ne pouvez pas attribuer une valeur de type définir à une variable de type définir . < / p>

Alternativement, votre interface pourrait être définir getfields () à la place. Vous peut assigner définir à une variable de capture.


5 commentaires

Notez que la construction d'un nouveau hashset entraînera la copie des entrées définies, ce qui supprime l'avantage de la performance de l'utilisation d'un énumexe en premier lieu.


Ouais. Votre réponse est meilleure :)


Le retour des types de caractères génériques des API est généralement découragé: elle ajoute une complexité aux classes appelant l'API. Probablement mieux pour simplement renvoyer un Set .


@Daniel: Je suis d'accord. Cela rend les choses plus complexes, mais dans certains cas, il est toujours utile. Je l'ai mentionné que parce que c'est une solution possible en fonction de la conception globale des OPS.


Bon point. Il semble que c'est une meilleure idée de SPIS, de rendre les interfaces plus flexibles, de sorte que le fournisseur de mise en œuvre retourne tout ce qu'ils veulent.



0
votes

Voici, je pense une bonne solution. Ce n'est pas exactement ce que vous voulez, mais plus près

import java.util.EnumSet;
import java.util.Set;

public class User {
    enum Fields implements Field {
        USERNAME,
        PASSWORD;
    }

    Set< ? extends Field> getFieldSet() {
        return EnumSet.allOf(Fields.class);
    }
}


0 commentaires

4
votes

Utilisez Collections.unmodifiaSet :

return Collections.<Field>unmodifiableSet(EnumSet.allOf(Fields.class));
  • Pas de conversion non sécurisée: l'opération est Typeafe à l'exécution LI>
  • Le jeu retourné est en fait un définir code>, pas un définit étend le champ> code> li>
  • L'ensemble n'est pas copié, seulement enveloppé li>
  • L'ensemble renvoyé ne peut pas être muté li> ul>

    contre: p>

    • L'ensemble retourné ne peut pas être muté, mais il ne serait pas sûr de le faire de toute façon. Li> ul> p>


0 commentaires

1
votes

La raison pour laquelle cela ne fonctionne pas est que définir n'est pas un sous-type de SET . Par exemple, si vous avez renvoyé un Set à partir de votre méthode, vous pouvez obtenir une situation comme suit: xxx

Votre meilleure option ici est d'utiliser un Différent mise en oeuvre définie (généralement un ensemble non modifiable) pour renvoyer les valeurs. Par exemple: xxx

ou, si vous avez besoin de l'ensemble pour être mutable (probablement pas une bonne idée, généralement) xxx / p>


0 commentaires