2013-08-14 5 views
0

외부 클래스 유형으로 매개 변수화 된 내부 클래스를 만들고 싶습니다.외부 클래스 유형의 매개 변수가있는 내부 클래스

내가 내 원하는 결과 같은 것을 달성하기 위해 더 나은 방법이있을 수 있습니다 실현, 나는이 제안을 열고 오전 먼저 말을해야하지만 약자로 나는 상황을 설명 할 것이다 :

내가 가진 클래스 Node<T> 아래와 같이 내부 클래스 선언에서 시도 : 몰라요하지만 이것은 컴파일시 구문 오류가 발생

public class Node<T> { 
    ... 

    class NodeIterator<Node<T>> implements Iterator { 
     ... 
    } 
} 

, 나는,이 외부 클래스의 내 사용으로 인한 것으로 추정 이거 확실히.

감사합니다.

+2

구문 오류와는 아무 상관 없습니다 이것은 내부 클래스입니다. 문제는'NodeIterator' 선언에서'< >'내부에있는 부분입니다. 'NodeIterator'는 generic 클래스입니다.이 경우에는'NodeIterator '와 같이 선언 할 수 있습니다. 그렇지 않은 경우는, NodeIterator와 같이 선언 할 필요가 있습니다. 그러나'NodeIterator >'로 선언하는 것은 의미가 없습니다. –

답변

6

단순히 수행

public class Node<T> { 
    ... 

    class NodeIterator implements Iterator<Node<T>> { 
     ... 
    } 
} 

는 내부 클래스로서, NodeIterator의 인스턴스가 외부 Node 인스턴스 암시 기준을 갖는다. 따라서 T 유형은 여전히 ​​본문 내에 있습니다. 대안 암시 외부 참조를 잃고, NodeIteratorstatic을하는 것입니다

참고 : 여기

static class NodeIterator<T> implements Iterator<Node<T>> { 
    ... 
} 

, T 새롭게 선언하고, 외부 클래스에서 선언 된 T 다른해야합니다.

자세한 내용은 Java Tutorials article on nested classes을 참조하십시오.

+0

내 의견을 게시하면서 답변을 편집했습니다. 좋은 타이밍입니다. 혼란을 피하기 위해 댓글을 삭제하겠습니다! – Muel

+0

@Muel 사실 저에 관해서 prodding 해 주셔서 감사합니다. 올바른 코드를 앞에 놓아야한다는 것을 깨달았습니다. –

1

내부 클래스 대신 Iterator 인터페이스에서 제네릭 형식 인수를 지정하십시오.

import java.util.Iterator; 

public class Node<T> { 


    class NodeIterator implements Iterator<Node<T>> { 

     @Override 
     public boolean hasNext() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public Node<T> next() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public void remove() { 
      // TODO Auto-generated method stub 

     }  
    } 
} 

내가 아무것도 같은 외부 클래스 유형과 일치하지 않습니다 구체적인 유형의 인스턴스에서 당신을 멈추지 않을 것이기 때문에 언어가이를 허용하지 않습니다 의심 :

//calling code 
Node<Integer> node = new Node<Integer>(); 

//Node.java 
public class Node<T>{ 

    NodeIterator<String> nodeIterator = new NodeIterator<String>(); 
}