2011-05-16 2 views
1

j'ai le problème de ne pas être en mesure d'appeler mes propres méthodes dans les éléments objet d'un tableauMéthodes publiques Inaccessible en Array Object

Voici le code pour la partie du code avec le tableau:

public class CardRules { 
    private Object cardArray[]; 

public CardRules(Object cardArrayCopy[]){ 

    cardArray = cardArrayCopy; 
    multiples(); 
} 
public void multiples(){ 
for(Object ArrayElement: cardArray){ 
    System.out.println(ArrayElement); 
} 
} 
} 

Et pour l'objet Carte:

public class Card { 
    private int rank; 
    private int suit; 
    private String Stringrank[] = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"}; 
    private String Stringsuit[] = {"Spades", "Hearts", "Diamonds", "Clubs"}; 
    public static int CardNo = 0; 

public Card(int cardDetails[]){ 
    rank = cardDetails[1]; 
    suit = cardDetails[0]; 
    CardNo++; 
} 
public String getCard(){ 
    return ("Card: " + Stringrank[rank] + " Of " + Stringsuit[suit]); 

} 
    public int getRank(){ 
     return rank; 
    } 
    public int getSuit(){ 
     return suit; 
    } 

}

la sortie de cette partie du programme sont les codes de hachage, Carte @ 9304b1 Carte @ 190d11 Carte @ a90653 Carte @ de6ced Carte @ c17164

je voudrais mettre quelque chose comme ou similaire

System.out.println(ArrayElement.getRank()); 

-ce que quelqu'un avoir des idées sur la raison pour laquelle cela se passe?

btw le tableau est copié à partir d'une liste de tableaux dans une autre classe en utilisant la méthode premade .toArray()

Répondre

3

Le compilateur ne peut pas connaître ces objets sont des cartes, puisque vous les déclarez comme Object s dans le tableau. Si vous êtes sûr qu'ils seront des cartes, déclarez le tableau comme Card (private Card cardArray[];) ou placez-les ((Card)ArrayElement).getRank().

Si vous voulez vérifier une fois de plus, utilisez ArrayElement instanceof Card pour vérifier qu'il s'agit d'une véritable instance Card avant la diffusion.

+0

S'il a accès à l'autre classe où le 'ArrayList' est converti en un tableau, il peut aussi le faire revenir un tableau de Type 'Card' en passant le tableau à la méthode' toArray'. De cette façon, il pourrait éviter le casting explicite sur les éléments de tableau individuels. par exemple. 'Card [] cardArray = (Carte []) list.toArray (nouvelle carte [array.size()])' –

0

System.out.println() appelle Object.toString(), Remplacez donc la méthode toString() de la classe Card. (BTW: il est préférable de faire le Stringrank et Stringsuit à la fois statique):

@Override 
public String toString() { 
    return String.format("Card [rank= %s, suit= %s]", 
      Stringrank[rank], Stringsuit[suit]); 
} 
+1

Encore mieux de les déclarer comme enums. Il est peu probable que les rangs et les combinaisons de cartes changent à tout moment. –

+0

@Urs: oui, d'accord. –