여기에 몇 가지 문제가 있습니다. 첫째, 내부 클래스 (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
}
...
}
즉 외부 사람을 숨기고 있기 때문에 당신은 유형 매개 변수 K
및 HashNode
에 대한 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];
당신이 정말로 배열을 유지를 주장한다면 내 대답의 완성도를 들어
만, 당신은 체크되지 않은 캐스트를 사용해야합니다
그러나 이것은 본질적으로 안전하지 않으며 은 수행하지 않아야합니다..
'HashNode [] array;는 초기화되지 않았습니다. 'array'를 고정 된 선상의 paremeter로 전달합니다. 'null'을'toArray()'에 건네면 NPE가 던져 질 것입니다. – jlordo
초기화하는 방법이 있습니까? 당신이 객체를 만들 수 없다고 가정 할 때? – user2007447
'HashNode [] array = new HashNode [0];' – jlordo