2016-07-03 3 views
-2

Ich dachte zuerst werde ich die Klassen skizzieren, mit denen ich arbeite, während eine Klasse zu konstruieren, die eine doppelt verknüpfte Liste enthält (ich verwende nicht die Java-Klasse eingebaut):Kann nicht von Objekt zu <myClass> Fehler konvertieren und Abfrage über Zeiger

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

Um klar zu sein, sind alle Klassen hier in separaten Dateien definiert. Karte ist eine separate Klasse, die ich erstellt habe. Ich erhalte eine Fehlermeldung, die besagt, dass Typ nicht übereinstimmt: In der angegebenen Zeile kann nicht von Objekt zu Karte konvertiert werden. Wie überwinde ich das? Auch, wie Sie vielleicht bemerkt haben, habe ich die Iterator-Funktion überladen, um es für meine Klasse mit verknüpften Listen zu verwenden, wie in How to implement iterator as an attribute of a class in Java vorgeschlagen. Wenn Sie Störungen bemerken/Vorschläge haben, wäre ich Ihnen sehr dankbar. Ich hatte auch eine Frage in Bezug auf die Delete-Methode in Myset. Ich konnte den Code aufgrund des obigen Fehlers noch nicht ausführen, habe aber meine Zweifel. Ich bin ziemlich neu in Java und ich bin es gewohnt, mit Zeigern in C zu arbeiten. Also dienen p und q als "Zeiger" auf die Speicherstellen der ursprünglichen Knoten in mylist und würde dies den Knoten erfolgreich löschen?

+0

* "Wie überwinde ich das?" * Sie erfahren etwas über [Generika] (https://docs.oracle.com/javase/tutorial/java/generics/index.html). Oder du gehst in die alte Schule und wirfst den Wert. – Andreas

+0

Knoten .. T-Element – Tim

+1

Node.getElement() gibt Object zurück. Sie versuchen, das zurückgegebene Objekt einer Variablen vom Typ Karte zuzuordnen. Der Compiler stimmt dem nicht zu: Es kann nicht sicher sein, dass das Objekt eine Karte ist. Sie müssen also Folgendes umsetzen: 'Karte x = (Karte) n.getElement();'. Ihr Code ist furchtbar eingerückt und Ihre Variablennamen sind schrecklich, was Ihren Code selbst für Sie sehr schwer lesbar macht. Sie hätten eine viel bessere Vorstellung davon, was Ihr eigener Code tut, wenn Sie ihn korrekt formatieren und gute Namen wählen. Methoden beginnen mit einem Kleinbuchstaben. Klassen beginnen mit einem Großbuchstaben. camelCase wird verwendet. –

Antwort

0

Wie in den Kommentaren vorgeschlagen, eine schnelle und einfache Lösung ist es, den Rückgabewert von getElement() zu Card einfach zu werfen:

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

Der Compiler weiß nicht, dass Sie nur Card Objekte in der Liste zu speichern sind , da es jede Unterklasse von Object (oder Object selbst) enthalten kann. In Ihrem Fall müssen Sie als Programmierer dem Compiler mitteilen, was Sie tun - und wenn Sie 100% sicher sind, dass die Liste nur Card Objekte enthält, können Sie den Rückgabewert sicher an Card übergeben.

Verwandte Themen