Открытые методы, недоступные в массиве объектов - PullRequest
1 голос
/ 16 мая 2011

У меня проблема с тем, что я не могу вызывать свои собственные методы в элементах массива

Вот код для части кода с массивом:

public class CardRules {
    private Object cardArray[];

public CardRules(Object cardArrayCopy[]){

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

А для объекта карты:

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;
   }

}

Выходные данные для этой части программы - хеш-коды, Card @ 9304b1 Card @ 190d11 Card @ a90653 Card @ de6ced Card @ c17164

Я хотел бы поставить что-то похожее или похожее

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

У кого-нибудь есть идеи относительно того, почему это происходит?

кстати, массив копируется из ArrayList в другой класс с помощью готового метода .toArray ()

Ответы [ 2 ]

3 голосов
/ 16 мая 2011

Компилятор не может знать, что эти объекты являются картами, поскольку вы объявляете их как Object s в массиве. если вы уверены, что это будут карты, объявите массив как Card (private Card cardArray[];) или раздайте их ((Card)ArrayElement).getRank().

Если вы хотите проверить еще раз, используйте ArrayElement instanceof Card, чтобы убедиться, что это настоящий Card экземпляр перед кастом.

0 голосов
/ 16 мая 2011

System.out.println() вызывает Object.toString(), поэтому перезаписать метод toString() класса Card.(кстати: лучше сделать Stringrank и Stringsuit оба статическими):

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