Question

Désolé, je pensais que c'était une question d'héritage: il était une question ArrayList tout au long

Ok, mon problème est plus précis que je pensais. J'ai donc deux familles de classes. Cartes et zones. Les zones sont des boîtes pour la carte de maintien.

Les deux premiers de la zone Sous-classes, ZoneList et ZoneMap sont destinés à être deux façons différentes de stockage des cartes. D'autres sous-classes, comme la main, et PokerHand, ont leurs propres méthodes de traitement des cartes qu'ils stockent.

Là où ça se complique est que la carte a aussi, comme Sous-classes PokerCard, et que les sous-classes de ZoneList et ZoneMap sont destinés à organiser ceux-ci.

Donc ZoneList j'ai et PokerHand protected ArrayList<Card> cardBox; Je pensais pouvoir déclarer depuis PokerCard est cardBox = new ArrayList<PokerCard>(); une carte. L'erreur que je reçois est que je ne peux pas apparemment jeté entre la carte et GangCard en matière de ArrayLists ... Je tente de résoudre ce problème en tout redéclarant Cardbox comme à l'intérieur PokerHand private ArrayList<PokerCard> cardBox;, mais qui a abouti à la dissimulation que a été mise sur écoute mon programme.

vraiment, la question est de coulée entre ArrayLists? Java me dit que je ne peux pas, donc des idées sur la façon dont je peux?

z.

Était-ce utile?

La solution

Si je vous comprends bien, vous devriez probablement déclarer:

public class ZoneList<T extends Card> {
   protected List<T> cardBox;
}

public class PokerHand extends ZoneList<PokerCard> {
   public PokerHand() {
      cardBox = new ArrayList<PokerCard>();
   }
}

Autres conseils

Marc et kolstae ont donné de bonnes réponses en termes de la façon de contourner le problème, mais je pense qu'il vaut la peine d'expliquer pourquoi votre code d'origine ne fonctionne pas.

Pour simplifier les choses, je tends à mettre le problème en termes de fruits. Supposons que nous ayons:

List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());

Si cela est permis, nous nous retrouvons avec une pomme dans un régime de bananes, ce qui est évidemment une mauvaise chose. Alors, où est le problème? La première ligne doit être d'accord, et la troisième ligne doit être d'accord - vous pouvez ajouter tout type de fruit à List<Fruit> - de sorte que le problème doit être dans la deuxième ligne. C'est ce qui est interdit, justement pour éviter ce genre de problème.

Est-ce que l'aide du tout?

Tout d'abord, il est généralement préférable d'utiliser des méthodes de lecture / setter que les propriétés accédant directement, surtout si vous allez faire beaucoup d'héritage compliqué.

En ce qui concerne le problème des génériques, vous pouvez essayer de définir le getter Cardbox dans la superclasse (ou interface / classe abstraite de niveau supérieur) comme:

protected ArrayList<? extends Card> getCardBox();

De cette façon, vous pouvez ovverride dans les sous-classes et de les retourner une liste de tous les types de sous-classe de la carte.

Une façon de le faire est par coulée à ArrayList premier:

ArrayList<Card> cards = (ArrayList<Card>)(ArrayList<?>) (pokerCardObjects);

Une autre alternative sans coulée:

Avec des flux:

ArrayList<Card> cards = pokerCardObjects.stream().collect(Collectors.toCollection(ArrayList::new);

Ou créer un nouveau ArrayList:

ArrayList<Card> cards = new ArrayList<>(pokerCardObjects);

Comme indiqué, vous ne pouvez pas jeter à ArrayList<PokerCard> ArrayList<Card>, mais vous pouvez jeter à ArrayList<? extends Card> List<? extends Card>. Ou mieux utiliser comme valeur List<? extends Card> list = new ArrayList<Card>(); de retour, parce que vous ne comptez pas sur probablement la mise en œuvre de toute façon ArrayList:

protected ArrayList<? extends Card> getCardBox();

Quant à votre question dans le commentaire, la construction devrait fonctionner comme vous l'avez: <=>. Vous avez sans doute de remplir votre liste, la méthode est probablement quelque chose comme ceci:

protected ArrayList<? extends Card> getCardBox() {
    List<Card> list = new ArrayList<Card>();
    list.add(pokerCard1);
    list.add(pokerCard2);
    return java.util.Collections.unmodifiableList(list);
}

Cela va dépendre de ce que le contrôle d'accès est le Arraylist dans Zonelist. Mon hypothèse de l'instruction debugger est qu'il est soit non marqué, public ou protégé. Une sous-classe peut « Masquer » une classe parent variable, il a accès à une variable en définissant avec le même nom. Vous pouvez également utiliser mot-clé pour faire référence this à l'instance d'objet particulier et mot-clé pour faire référence super au parent.

Voici un bon lien sur le contrôle d'accès de base en Java:

http://java.sun.com/docs /books/tutorial/java/javaOO/accesscontrol.html

Vous trouverez peut-être également utile

http://java.sys-con.com/node/46344

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top