2013-04-24 3 views
7

체이닝을 사용하여 해시 테이블의 데이터 구조를 쓰려고합니다. 중첩 클래스에서 키워드 "static"을 제거하면 "SeparateChaining.Node의 일반 배열을 만들 수 없습니다"라는 오류가 발생합니다. 어디에 새를 사용하여 hmap에 메모리를 할당하는 줄에.일반 외래 클래스의 경우 중첩 클래스를 정적으로 선언해야하는 이유는 무엇입니까?

정적 키워드를 사용하면 잘 작동합니다. 여기 정적 인 키워드의 중요성과 그 차이점을 지적 해 주실 수 있습니까? 개체의 배열을 만드는 중입니다. 그런 다음 오류 (Eclipse)에 제네릭 배열이 어떻게 표시됩니까?

public class SeparateChaining<Key,Value> { 

    private int m; 

    private Node[] hmap; 

    private int n; 

    public SeparateChaining() 
    { 
     m=5; 
     n=0; 

     //error here on removal of static keyword from the node class declaration 
       hmap=new Node[m]; 

    } 

    private ____ class Node //works fine with static. Otherwise shows error 
    { 
     private Object key; 
     private Object value; 
     private Node next; 

     public Node(Object k, Object v) 
     { 

      key=k; 
      value=v; 
     } 

    } 

감사

+0

'key'의 타입이'Key'가 아니고'value'의 타입이'Value' ('Object'가 아님)입니까? 그리고 생성자 매개 변수도 마찬가지입니까? – Dukeling

답변

6

클래스를 static으로 선언하면 클래스는 외부 클래스 SeparateChaining과 연결됩니다. Node은 실제로는 SeparateChaining.Node입니다.

static이 없으면 SeparateChaining의 인스턴스와 연결되며, 두 개의 유형 매개 변수가 필요하므로 내부 Node 클래스에도 이러한 유형 매개 변수가 필요합니다. Node은 실제로는 SeparateChaining<Key, Value>.Node입니다. Java에서는 creating an array of generics이 유효하지 않습니다.

+0

위의 코드에 추가하면 노드를 만들려고 할 때 IndoKnight

+0

@Dukeling 그러면 프로그램의 의미가 조금 바뀔 것입니다. 맞습니까? –

+0

이 경우 Node의 type 매개 변수는 외부 'SeparateChaining'의 type 매개 변수와 같지 않습니다. 그 값을 사용하는 대신 그 값을 어둡게 할 것입니다. –

0

음, 일반적이다. 내부 클래스가 정적이 아닌 경우 형식은 SeparateChaining<Key,Value>.Node입니다. static을 추가하면 일반 클래스처럼 취급됩니다.

-1

중첩 된 클래스의 선언에 Keyowrd static은 "나는 외부 클래스의 객체에 대한 참조를 갖고 싶지 않습니다."라고 의미합니다. static을 입력하지 않으면 내부 클래스의 모든 객체에 외부 클래스의 일부 객체에 대한 참조가 있습니다.

따라서 내부, 비 정적 클래스의 개체는 외부 클래스의 개체의 비 정적 메서드 내에서만 만들 수 있습니다.