2012-05-30 5 views
1

Я создал общий связанный список, чтобы создать связанный список строк.
Однако я получаю эту ошибку:
Java: исключение общего класса

Exception in thread "main" java.lang.NoSuchMethodError: Node.<init>(Ljava/lang/Object;)V 
at LinkedList.addNode(LinkedList.java:10) 
at LinkedList.<init>(LinkedList.java:22) 
at Trial.main(Trial.java:7) 


Из трассировки стека, ошибка генерируется на ADDNODE LinkedList по методу(). Im, включая определение этого метода, а также определение класса Node.
LinkedList ADDNODE()

public void addNode(T n) { 
     Node<T> temp = new Node<T>(n); 
     if(start==null) { 
      start = temp; 
      current = start; 
     } else { 
      end.setNext(temp); 
     } 
     end =temp; 
    } 


Node.java

public class Node<T>{ 
private T n; 
Node next; 
Node(T n) { 
    this.n = n; 
    next = null; 
} 
public void setNext(Node nextNode) { 
    next = nextNode; 
} 
public Node getNext() { 
    return next; 
} 
public T getN() { 
    return n; 
} 
@Override 
public String toString() { 
    if(n instanceof String) 
     return n.toString(); 
    else { 
     return T.toString(); 
    } 
} 

}



LinkedList.java

public class LinkedList<T>{ 
Node start; 
Node end; 
Node current; 
private static final long serialVersionUID = 901L; 
    LinkedList(T n) { 
     addNode(n); 
    } 
    public void addNode(T n) { 
     Node<T> temp = new Node<>(n); 
     if(start==null) { 
      start = temp; 
      current = start; 
     } else { 
      end.setNext(temp); 
     } 
     end =temp; 
    } 

    LinkedList(T[] n) { 
     for(T print : n) 
     addNode(print); 
    } 
    public void addNode(T[] n) { 
     if(n!=null) { 
      for (T values : n) { 
       addNode(values); 
      } 
     } 
    } 

    public void incC() { 
     current = current.getNext(); 
    } 
    public void insert(T n) { 
     Node newNode = new Node(n); 
      if(current==start){ 
       newNode.setNext(current); 
       start = newNode; 
      }else { 
       Node tempstart = start; 
       Node prevAdd=null; 
       while(tempstart!=current){ 
        prevAdd = tempstart; 
        tempstart = tempstart.getNext(); 
       } 
       prevAdd.setNext(newNode); 
       newNode.setNext(current); 
      } 
    } 

    public void find(T x) { 
     Node tempstart; 
     tempstart = start; 
     while (tempstart!=null) { 
      if(tempstart.getN()==x) { 
       System.out.println("Element found"); 
       tempstart = tempstart.getNext(); 
      } else { 
       tempstart = tempstart.getNext(); 
      } 
     } 
    } 
    public void delete(T x) { 
     Node previous=null; 
     Node tempstart = start; 
     while(tempstart!=null) { 
     if(tempstart.getN()==x) { 
      if(previous ==null) { 
       previous = tempstart; 
       tempstart = tempstart.getNext(); 
       start = tempstart; 
       previous.setNext(null); 
       previous = null; 
      } else { 
       tempstart = tempstart.getNext(); 
       previous.setNext(tempstart); 
      } 
     }else { 
      previous = tempstart; 
      tempstart = tempstart.getNext(); 
     } 
     } 
    } 
    @Override 
    public String toString() { 
     Node tempNode = start; 
     String str = "Values: "; 
     while (tempNode!=null) { 
      str = str + " " + tempNode.toString(); 
      tempNode = tempNode.getNext(); 
     } 
     return str; 
    } 
} 

Trial.java

public class Trial { 
public static void main(String[] args) { 
    String[] para = {"Hollo","this","is","me"}; 
    LinkedList<String> L1; 
    L1 = new LinkedList<String>(para); 
    System.out.println(L1); 
} 
+0

Вы можете поделиться своим кодом в Trial.main (...), который вызывает LinkedList – Kshitij

+0

** @ Kshitij ** done –

ответ

2

Вы должны объявить start, end и current полей в LinkedList<T> и next поле в Node<T> как тип Node<T>, не Node. Не используйте необработанные типы в любом месте кода, потому что они переводят на Node<Object>.

+0

Это разрешило это для меня, сэр, однако, у меня есть вопрос. Почему нет следующего в классе Node с и только в LinkedList <> –

+0

@FasihKhatib, извините, но я не следую вашему вопросу. Вы устранили * все * необработанные упоминания «Узел»? –

+0

Извините, мой плохой, прочитайте это неправильно. Спасибо load :) –

4
return T.toString(); 

это не работает. T - это переменная типа и доступна только во время компиляции из-за стирания типа.

Но, кроме того, я не вижу, что не так, вам нужно выставить больше кода из своего класса LinkedList.

+0

** @ Sean ** Ну, если бы я должен был создать связанный список целых чисел, тогда я бы потребовал, чтобы это не я? Я немного изменил код после того, как я разместил его. Похоже, это сейчас БЩЕСТВЕННОЙ Строка ToString() { \t \t если (п InstanceOf строки) \t \t \t возвращение n.toString(); \t \t еще { \t \t \t возврата T.toString (п); \t \t} \t} –

+0

@FasihKhatib нет, просто написать 'вернуть n.toString()' или нуль-SAFE: 'вернуть String.valueOf (п)' –

+0

Хорошо, я буду редактировать этот пост, чтобы включить весь defn of LinkedList.java –

1

Ваш класс Node не компилируется, поэтому вполне вероятно, что вы должны сначала решить эту проблему, прежде чем продолжить:

return T.toString(); 

не имеет смысла. Вероятно, это просто написание этого:

return n.toString(); 

на данный момент достаточно.

+0

Нет, ошибка по-прежнему сохраняется –

+0

@FasihKhatib Затем отредактируйте свой вопрос и опубликуйте полный код для LinkedList. –

+0

** @ Guilaume ** Done !! –

1

В Node.java, в методе

@Override 
public String toString() { 
    if(n instanceof String) 
     return n.toString(); 
    else { 
     return T.toString(); 
    } 
} 

// ниже заявление thows ошибки компиляции. return T.toString();

+0

** @ JackAss ** Я даже пробовал return n.toString(); , но он все еще дает эту ошибку. Вероятно, что-то связанное с конструктором Node.java –

+0

toString() обычно является нестационарным. Итак, если T - класс, то T.toString() означает, что класс должен иметь значение по умолчанию toString() как статическое. Но это неправда. следовательно, ошибка компиляции. Если вы берете какой-либо класс по умолчанию, он расширяет класс Object, поэтому вы получаете нестатический toString(). Следовательно, n.toString() работает, и T.toString() приводит к сбою компиляции – JackAss

+0

Я удалил этот оператор, поэтому только n.toString() есть, но все же есть ошибка. Может быть, есть ошибка в том, как я определил класс Node.java? –

1

Ваш Node Конструктор не public, поэтому он не будет работать, если вы вызываете его из класса в другой упаковке.

+0

Конструктор будет работать до тех пор, пока все исходные файлы находятся в одном каталоге :) –

Смежные вопросы