2012-04-29 1 views
-3

я определил этот узел в этом пакете:Почему в вложенном классе нельзя использовать импортированные пакеты?

package provided; 
public interface Node{ 
    public Node getNext(); 
} 

здесь я хочу использовать узел, проблему в вложенной классе «LinkedListIterator», он не может видеть мои методы Node:

import provided.Node; 
class LinkedList { 
    private Node head; 
    head.getNext(); // there is no error here, the method getNext() is available 
    class LinkedListIterator <Node> implements Iterator<Node> { 
     private Node next_node; 
      public Node next(){ 
       return next_node.getNext(); // The method getNext() is 
              // undefined for the type Node 
      } 
    } 
} 
+1

Можете ли вы дать полную ошибку? Я вижу другую проблему с этим кодом: 'LinkedListIterator.next()' delcares возвращает 'Node', а возвращает 'next_node.getNext()', который является 'Integer'. – amit

+0

Пример кода - беспорядочный. Я думаю, что проблема может заключаться в том, что getNext(), который возвращает Node i, не определен. –

+0

В вашей 'следующей' подписке' Public' закрыт. Это ошибка. Сначала исправьте это, а затем переходите к следующей проблеме. –

ответ

0

вы получили это в интерфейсе

public Integer getNext(); 

но ваш анонимный класс это определено

Public Node next() { 
    return next_node.getNext() 

, который не соответствует типу возврата. Вы должны изменить свой интерфейс на что-то вроде этого

public Node getNext(); 
+2

Хотя это правда, это не ответ - поскольку он не будет генерировать указанную ошибку. [Вот почему я сказал это как комментарий]. Это также не соответствует редактированию OP. – amit

+0

Я исправил вопрос, по-прежнему та же проблема, я использую eclipse при вводе next_node. он должен показать мне методы, но я вообще не получаю методы интерфейса, например, в вложенном классе не отображается определенный узел интерфейса. – nabil

4

На самом деле, проблема здесь не в том, что класс узел не имеет метода GetNext(), но из-за дженериков участие, вы заявили ваши Iterator как class LinkedListIterator <Node> implements Iterator<Node> { теперь, когда вы объявляете переменную типа Node, компилятор принимает его для типа Generic Type, определяемого именем «Node», чтобы решить эту проблему, измените объявление следующего узла как private provided.Node next_node; или, альтернативно, определите другое имя для общих в, например, для .. тип, т и т.д ..

`

class LinkedListIterator <Node> implements Iterator<Node> { 
    private provided.Node next_node; 

     @Override 
     public Node next() { 
      return next_node.getNext(); 
     } 

`

+0

хороший улов. +1. – amit

+0

yes Я сделал это уже и это работает, но не понял, почему компилятор не возьмет мой определенный узел в generics?! будет класс LinkedListIterator реализует Iterator работает? – nabil

+0

@nabil все, что мы передаем в качестве общих типов, - это просто имя, его не фактические имена классов или типы, которые нужно вернуть, возможно, вы хотели бы больше узнать о типе Erasure на странице http://docs.oracle.com/javase /tutorial/java/generics/erasure.html, это поможет вам понять проблему, напишите, если вы все еще не уверены в причине –