2016-07-03 6 views
-2

考え方二重リンクリストを保持しているクラスを構築する際に、私が最初に取り組んでいるクラスの概要を説明します(私はJavaのinbuiltクラスを使用していません)。オブジェクトから<myClass>への変換ができず、ポインタについての問い合わせ

class Node { //Forms the nodes of the list 
     private Object element; 
     private Node next; 
     private Node prev; //....other methods etc. 
} 

    public class mylist implements Iterable<Node> { 
    Node head; Node tail; //.... 
    @Override 
     public Iterator<Node> iterator() { 
      return new myit(this); 
     } 
    public class myit implements Iterator<Node> {  
      mylist set; 
      Node curr; 
      myit(mylist input) { 
       set=input; 
       curr=set.head; 
      } 
      @Override 
       public boolean hasNext() { 
        return (!(curr.getNext()==set.tail)); 
       } 
      @Override 
      public Node next() { 
       if (this.hasNext()) return curr.getNext(); 
      } 

     } 



    public class Myset { 
      mylist set; 
      //... 
public void Delete(Object o) { 

     for(Node p: this.set) { 
      if(p.getElement().equals(o)) { 
      Node q=p.getNext(); 
      p.getPrev().setNext(q); 
      q.setPrev(p); 
      break; 
     }} 
    } 
    public static void main(String[] as) { 
      Myset m=new Myset(); 
      for(int i=1; i<5;i++) { 
       m.Insert(new Card(i)); 
      } 
      for(Node n: m.set){ 
       Card x=n.getElement(); //ERROR HERE 
       System.out.println(x.number()); 
      }} 

ここでのすべてのクラスは、別々のファイルで定義されています。カードは私が作成した別のクラスです。タイプミスマッチが表示されるエラーが表示されます:指定された行のObjectからCardに変換できません。どのように私はこれを克服するのですか? また、私は、How to implement iterator as an attribute of a class in Javaで提案されている方法を使用して、リンクリストクラスにイテレータ関数を使用するためにイテレータ関数をオーバーロードしていることにお気づきかもしれません。不具合に気づいたら、私は非常に感謝しています。 私はMysetのDeleteメソッドに関連する質問もありました。私はまだ上記のエラーのためにコードを実行することができませんでしたが、私はこれについて疑問を持っています。私はむしろJavaの新人です。私はCでポインタを使って作業するという考えに慣れています.pとqはmylistの元のノードのメモリ位置の 'ポインタ'として機能し、ノードを正常に削除しますか?

+0

*「どのようにこれを克服するのですか?」* [generics](https://docs.oracle.com/javase/tutorial/java/generics/index.html)について学びます。または、あなたは昔の学校に行き、価値をキャストします。 – Andreas

+0

ノード .. T要素 – Tim

+1

Node.getElement()はObjectを返します。返されたオブジェクトを、タイプCardの変数に代入しようとしています。したがって、コンパイラの意見は一致しません。オブジェクトがカードであることを確かめることはできません。だからあなたはキャストする必要があります: 'Card x =(Card)n.getElement();'。あなたのコードはひどくインデントされていて、変数名はひどいので、あなたのコードを読みにくくすることができます。あなたが正しく書式を設定し、良い名前を選んだら、自分のコードが何をするかということについて、はるかに良いアイデアを得るでしょう。メソッドは小文字で始まります。クラスは大文字で始まります。 camelCaseが使用されます。 –

答えて

0

コメントで示唆したように、1つの迅速かつ簡単な解決策は、単にCardgetElement()の戻り値をキャストすることです:

Card x = (Card) n.getElement(); 

コンパイラは、あなただけのリストにCardオブジェクトを格納していることを知りませんObject(またはObject自身)のサブクラスを保持できるためです。あなたの場合、プログラマはあなたが何をしているのかをコンパイラに伝える必要があります。が100%の場合、にはCardオブジェクトのみが含まれます。戻り値はCardになるようにしてください。

関連する問題