类型中的方法不适用于参数

时间:2014-05-09 04:12:27

标签: java generics linked-list

我试图制作纸牌游戏,但我遇到了一些小问题。我正在尝试从我的新列表卡中添加另一个类的卡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++;
}

元素类(在singlelinkedlist类中)

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;

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

如果您需要更多信息,或者我需要改写一些内容,请告诉我:)

3 个答案:

答案 0 :(得分:0)

我认为您应该使currentCard类型Card变量而不是类型Element<Card>

答案 1 :(得分:0)

你需要从它所带的元素中提取currentCard.value应该做你想做的事。

但也许你应该保留一些令人头疼的事,只需使用 java.util.List

答案 2 :(得分:0)

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

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

但是,正如我所看到的那样,你没有调用任何特定的Card方法,也没有对Card进行任何TypeStrict操作。所以真的,没有必要将E转换为Card。

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

  • 在Element类中,如果将属性设置为public,则会违反Encapsulation。这意味着说任何其他类都可以修改其内容的属性。在OOP中,不建议这样做。

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

希望这有帮助