2013-01-24 4 views
1

그 사이트에 대한 나의 첫 번째 질문! ... 나는 내 연구를 했어 '아무것도하지만, 정말 작동하지 않습니다배열 제네릭을 사용하는 클래스에서 생성

그래서, 여기에 문제는,이 자바 일반 배열 생성과 관련이있다 :

class HashArray<K,V>{ 

    class HashNode<K,V>{ 
... 
} 


HashNode[] array; 

HashArray(int size){ 

ArrayList<HashNode> arrayM = new ArrayList<HashNode>(size); 

array = arrayM.toArray(array);       // pinned Line 

} 

} 

와 NullPointerException가 고정 된에있다 선.

array = new HashNode[size]; 

가 나는 Generics Array Creation error를 얻을 : 내가 좋아하는 뭔가를하려고하면.

배열을 사용하여 프로젝트를 만들 수 있기 때문에 HashNode에서 배열이 필요합니다.

미리 감사드립니다.

+0

'HashNode [] array;는 초기화되지 않았습니다. 'array'를 고정 된 선상의 paremeter로 전달합니다. 'null'을'toArray()'에 건네면 NPE가 던져 질 것입니다. – jlordo

+0

초기화하는 방법이 있습니까? 당신이 객체를 만들 수 없다고 가정 할 때? – user2007447

+0

'HashNode [] array = new HashNode [0];' – jlordo

답변

3

여기에 몇 가지 문제가 있습니다. 첫째, 내부 클래스 (HashNode)는 선언 클래스 (HashArray)의 인스턴스에 대한 암시 적 참조를가집니다. 따라서 선언 클래스의 유형 매개 변수 범위 내에 있습니다.

class HashArray<K, V> { 

    class HashNode { 
     //K and V still have meaning in here 
    } 

    ... 
} 

어느 쪽이든, 또는 만들 HashNode 자신을 위해 일을 단순화하는 정적 중첩 클래스 :

class HashArray<K, V> { 

    static class HashNode<K, V> { 
     //no implicit reference to an outer HashArray 
    } 

    ... 
} 

즉 외부 사람을 숨기고 있기 때문에 당신은 유형 매개 변수 KHashNode에 대한 V을 재 선언하지 말아야 배열 만들기 : 구체적인 매개 변수화 된 유형의 배열을 만들 수 없습니다. explanation on why에 대한 Angelika Langer의 제네릭 튜토리얼을 참조하십시오. 즉, 제네릭과 배열은 기름과 물과 같으므로 컬렉션을 사용해야합니다.

가장 좋은 해결책은 대신 List<HashNode>을 사용하는 것입니다.

List<HashNode> nodeList = new ArrayList<HashNode>(size); 

을 아니면 HashNode 정적 클래스 만들 경우 : 당신은 이미 어쨌든 일부터 시작하고 자바 7에서 RHS 그냥 두 경우 모두 new ArrayList<>(size) 될 수 있음을

List<HashNode<K, V>> nodeList = new ArrayList<HashNode<K, V>>(size); 

참고.

@SuppressWarnings("unchecked") 
HashNode[] array = (HashNode[])new HashArray<?, ?>.HashNode[size]; 

또는 HashNode 경우 정적되었다 :

@SuppressWarnings("unchecked") 
HashNode<K, V>[] array = (HashNode<K, V>[])new HashNode<?, ?>[size]; 
당신이 정말로 배열을 유지를 주장한다면 내 대답의 완성도를 들어


만, 당신은 체크되지 않은 캐스트를 사용해야합니다

그러나 이것은 본질적으로 안전하지 않으며 은 수행하지 않아야합니다..

+0

] 답변을 보내 주셔서 감사합니다! 정말 감사합니다! 문제는 배열 만 사용해야한다는 것입니다. 나는 바이너리 트리 나 그 (것)들을 피하는 것을 만들 수 있었지만, 연구 후에 나는이 프로젝트를 깔끔하게 만드는 가장 좋은 방법은 해시 배열 (Hash Array)이라는 것을 발견했다. 그래서 배열만으로 일반 해시 (모든 객체에는 hashCode()가 있음)를 구현해야합니다. 이것은 거래입니다. 콜렉션을 사용하면 케이크 한 조각이었을 것입니다. 그렇지만 나는 허용되지 않습니다. – user2007447

+0

편집 후 완벽하게 만들었습니다! – user2007447

+0

@ user2007447 그래도 안전하지는 않다고 과장해서는 안됩니다. 이유를 이해하려면 링크 된 기사를 읽는 것이 좋습니다. 과제물처럼 들리므로 교수님과의 관계를 명확하게 설명해 드리겠습니다. 그녀/그에게 물어보고이 게시물을 가리 키도록하십시오. –