Domanda

Siamo spiacenti, ho pensato che questa era una domanda eredità: si trattava di una questione ArrayList lungo tutto

!

Ok, il mio problema è più specifico di quanto pensassi. Così ho due famiglie di classi. Carte e zone. Le zone sono scatole per possesso di carta.

I primi due sottoclassi di Zone, ZoneList e ZoneMap sono destinate ad essere due diversi modi di conservare le schede. Ulteriori sottoclassi, come la mano, e PokerHand, hanno i loro modi specifici di trattare con le carte che immagazzinano.

Dove diventa complicato è che carta ha anche sottoclassi, come PokerCard, e che le sottoclassi di ZoneList e ZoneMap hanno lo scopo di organizzare quelli.

Quindi, in ZoneList ho protected ArrayList<Card> cardBox; e PokerHand mi aspettavo di essere in grado di dichiarare cardBox = new ArrayList<PokerCard>(); poiché PokerCard è una scheda. L'errore che sto ottenendo è che a quanto pare non posso cast tra Card e GangCard quando si tratta di ArrayLists ... Così mi stava cercando di risolvere questo problema solo redeclaring Cardbox come private ArrayList<PokerCard> cardBox; all'interno PokerHand, ma che ha portato alla clandestinità che è stato intercettazioni il mio programma.

Quindi, in realtà, la questione è di circa la fusione tra ArrayLists? Java ME non posso dice, così tutte le idee su come posso?

z.

È stato utile?

Soluzione

Se ho capito bene, probabilmente si dovrebbe dichiarare:

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

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

Altri suggerimenti

Marc e kolstae hanno dato buone risposte in termini di come aggirare il problema, ma penso che ne vale la pena spiegare perché il codice originale non funziona.

Per semplificare le cose, ho tendono a mettere il problema in termini di frutta. Supponiamo di avere:

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

Se questo è permesso, si finisce con una mela in un casco di banane, che ovviamente è una cosa negativa. Quindi dov'è il problema? La prima linea deve essere a posto, e la terza linea deve essere a posto - è possibile aggiungere qualsiasi tipo di frutta a List<Fruit> - in modo che il problema deve essere nella seconda riga. Questo è ciò che è proibito, proprio per evitare questo tipo di problema.

Fa che aiutano a tutti?

Prima di tutto, di solito è meglio la pratica di utilizzare metodi getter / setter di accedere alle proprietà direttamente, soprattutto se avete intenzione di fare un sacco di eredità complessa.

Per quanto riguarda il problema dei farmaci generici, si potrebbe provare a definire il getter Cardbox nella superclasse (o di primo livello di interfaccia / classe astratta) come:

protected ArrayList<? extends Card> getCardBox();

In questo modo è possibile ovverride in sottoclassi e li hanno restituiscono un elenco di qualsiasi tipo di sottoclasse di carta.

Un modo per farlo è quello di lanciare a ArrayList prima:

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

Un altro alternative senza casting:

Con i flussi:

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

o la creazione di un nuovo ArrayList:

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

Come già detto, non puoi lanciare ArrayList<PokerCard> a ArrayList<Card>, ma si può lanciare ArrayList<? extends Card> a List<? extends Card>. O uso migliore List<? extends Card> list = new ArrayList<Card>(); come valore di ritorno, perché probabilmente non si basano sulla realizzazione ArrayList in ogni caso:

protected ArrayList<? extends Card> getCardBox();

Per quanto riguarda la tua domanda nel commento, la costruzione dovrebbe funzionare come hai descritto: <=>. Probabilmente è necessario compilare la vostra lista, in modo che il metodo è probabilmente qualcosa di simile:

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

Si tratta di andare a dipendere da ciò che il controllo di accesso è sul Arraylist in Zonelist. La mia ipotesi dalla dichiarazione debugger è che è o non marcato, pubblico, o protetti. Una sottoclasse può "nascondere" una variabile genitore di classe ha accesso ad definendo una variabile con lo stesso nome. È inoltre possibile utilizzare this parola chiave per fare riferimento alla particolare istanza dell'oggetto e super parola chiave per riferirsi al genitore.

Ecco un buon collegamento sul controllo accesso di base in Java:

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

In questo modo si potrebbe anche trovare utile

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top