无法调用原始类型int

时间:2013-01-22 20:12:56

标签: java arrays

它出现了“无法在原始类型int上调用getNumber()。为什么?

公共卡片findLargest(){

    ArrayList<Card> cardStack;}
    public Card getLargest() {
      Card largest;
      Card c;
      for (int i = 1, largest = cardStack.get(0); i < cardStack.size(); i++) {
        c = cardStack.get(i);
        if (largest.getNumber() > c.getNumber()) {
          largest = c;
          continue;
        } else if (largest.getNumber() == c.getNumber()) {
          if(largest.getSuit().equals("Diamonds"))
              largest = c;
            continue;

1 个答案:

答案 0 :(得分:1)

largest = c;

由于现在需要让largest变量引用具有新最高值的卡,您只需将变量指向该变量即可。

下次约largest.getNumber()将返回c.getNumber()现在返回的内容。

确保Card largest;的声明不在您的循环之内。

编辑:

我会为您添加一些解释,希望能回答您的问题。

当你声明一个Object时:

Card c;

您正在创建一个引用变量,该变量可以引用Card类型的任何对象(或子类)。通过创建该对象的实例......

Card c = new Card();

您正在保留记忆并初始化其子对象/灵长类动物。

所以当你写这样的函数时:

List<Card> cardStack; //Just assuming you have a List of cards
public Card getLargest() {
  Card largest;
  Card c;
  for (int i = 1, largest = cardStack.get(0); i < cardStack.size(); i++) {
    c = cardStack.get(i);
    if (largest.getNumber() > c.getNumber()) {
      largest = c;
    } else if (largest.getNumber() == c.getNumber()) {
      if(...)//Check suits as you would
    }
  }
  return largest;
}

您正在创建引用堆栈中存在的Card对象的变量。引用没有新的内存分配(除了保存引用所需的内存)。

因此,您将拥有在其他位置创建的卡对象列表,以及两个仅指向存储在其他位置的对象clargest的引用。从函数返回Card会返回该引用,因此您对其执行的任何操作都会影响它引用的卡。

或者,您clone该对象并发回一个相同但不同的对象,您对其所做的任何修改都不会影响原始卡。在许多对象中,仅创建新对象,从不修改旧对象的能力称为Immutable。例如,String对象是不可变对象。

当我谈到需要在循环外写入Card largest;时,意味着分配给持有引用的内存仅存在于循环的范围内。如果我们这样做:

for (....) {
  Card largest;
  //...
}

...每次循环迭代时,largest变量都会被销毁并重新创建,删除我们在其中保存的引用或数据。对于我上面的更大的例子,我们可以将Card c;放在循环中,因为我们只关心循环持续时间c是什么,而后来最大的问题。这称为可变范围。