【问题标题】:The method in the type is not applicable for the arguments类型中的方法不适用于参数
【发布时间】:2014-06-26 17:07:21
【问题描述】:

我正在尝试制作纸牌游戏,但我遇到了一些小问题。我正在尝试在我的新列表卡片中添加来自另一个类的卡片 currentCard。我收到错误 SingleLinkedList 类型中的方法 addLast(Card) 不适用于参数 (DoubleLinkedList.Element)。

public class CardList<E extends Comparable<? super E>> extends SingleLinkedList<E> {

private SingleLinkedList<Card> cards;

private int cardRow;                

public CardList(int cardRow) {

    this.cardRow = cardRow;
    cards = new SingleLinkedList<Card>();

        cards.addLast(CardDeck.currentCard);   // here is the error
    }
}

我在 SingleLinkedList 中的 addLast 方法:

public class SingleLinkedList<E> {

protected transient Element<E> head;
protected transient int size;

public SingleLinkedList() {
    head = null;
    size = 0;
}

public void addLast(E value) {
    Element<E> temp = new Element<E>(value, null);
    if (head != null) {
        Element<E> finger = head;
        while(finger.next != null) {
            finger = finger.next;
        }
        finger.next = temp;
    } else {
        head = temp;
    }
    size++;
}

元素类(在单链表类中)

protected static class Element<E> {

    public E value;
    public Element<E> next;

    public Element(E value, Element<E> next) {
        this.value = value;
        this.next = next;
    }
}

以及 DoubleLinkedList 类中的 currentCard 变量

 public class CardDeck<E extends Comparable<? super E>> extends DoubleLinkedList<E> {


private DoubleLinkedList<Card> cards;
static Element<Card> currentCard;

我知道问题是我试图将一个元素插入到一个期望获得卡片的方法中,但我只是不知道如何将它从泛型转换为特定类型(卡片)或其他东西。我一直在寻找一些关于泛型的好教程,但还没有找到直接帮助我的东西。因此,如果有人有一些关于直接解决我的问题的提示,或者有关于该主题的教程/描述的良好链接,我将非常感激!

如果您需要更多信息,或者我需要重新措辞,请告诉我:)

【问题讨论】:

  • 我认为这很简单。您的currentCardElement&lt;Card&gt; 类型。根据变量名,我希望它是 Card 类型,如果是这样,那么您将不会看到该错误。
  • 我记得我年轻的时候过度使用继承......你应该只为这种东西使用内置列表并将它与你的对象一起包装,而不是从你自己的自定义列表继承。
  • @Bhesh 我也在尝试,但后来我遇到了更多关于 card.next 等操作的问题,我想我必须在没有 E 部分或其他东西的情况下重做列表中的所有内容。希望有一种更简单的方法可以将 Element 转换为 card 或其他东西
  • @josaphatv 我希望我可以只使用内置列表等,但部分交易是我们必须使用我们自己的列表实现,但是所有这些泛型的东西让我头疼:P
  • 你有什么理由扩展和委托给相同的列表类型?

标签: java generics linked-list


【解决方案1】:

我认为你应该将currentCard 变量设为Card 类型而不是Element&lt;Card&gt; 类型。

【讨论】:

    【解决方案2】:

    你需要从它进来的Element中提取CardcurrentCard.value应该做你想做的事。

    但也许您应该省去一些麻烦,而只需使用 java.util.List

    【讨论】:

      【解决方案3】:

      我不确定您为什么要编写自己的 LinkedList。也许这是家庭作业? 正如 josaphatv 所建议的,使用 Java LinkedList 将解决您实现 LinkedList 的问题。

      主要问题就像 josaphatv 提到的那样。你应该传入一张卡片,它是 currentCard.value 而不是 Element 本身。而且您不需要将 E 转换为 Card(尽管可以通过使用类型转换 (Card) 值来实现。

      但是,正如我所见,您没有调用 Card 的任何特定方法,也没有对 Card 进行任何 TypeStrict 操作。所以说真的,没必要把E转成Card。

      现在,在设计和实现方面,这里有很多不好的做法,我只记下两个基本的东西。

      • 在 Element 类中,将两个属性都公开,违反了封装。这意味着说任何其他类都可以修改其核心内容的属性。在 OOP 中,不建议这样做。

      • 如前所述,为什么要重新发明轮子,使用 Java.util.List 可以做得更好,请尝试在 Google 上搜索 LinkedList java。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-16
        • 2019-01-17
        相关资源
        最近更新 更多