2012-08-27 3 views
0

나는 휠을 조금 재발견하고 Java에서 ArrayList와 비슷한 제네릭 어레이 지원 목록 클래스를 만들려고합니다. 네, 이것이 바보라는 것을 압니다 만 학문적 인 추구입니다. 문제는 당신이 자바의 ArrayList에이 같은 일을하고 있기 때문에 반드시이 문제에 대한 해결책을이 있어야합니다 제네릭 형식Java로 일반 목록을 만들려면 어떻게해야합니까?

public class MySuperCoolList<E> { 
    E[] array; 

    public MySuperCoolList<E>() { 
     array = new E[10]; // ERROR: cannot do this! 
    } 
} 

의 배열을 인스턴스화 할 수 있다는 것입니다. 질문은, 어떻게? 제네릭 형식 E 배열을 어떻게 인스턴스화 할 수 있습니까? ArrayList에서 어떻게 처리됩니까?

+1

은'ArrayList' 내부적 ('[] 오브젝트) Object's'의 배열 요소를 유지한다. 일반적인 배열을 만드는 것은 불가능합니다 (사전에 타입을 알지 못함). – MadProgrammer

+0

가능한 [Java 방법 : 일반 배열 생성] (http://www.stackoverflow.com/questions/529085/java-how-to-generic-array-creation) 중복 가능 – Neil

+0

아마도 C# 배경입니까? –

답변

4

그리고 ArrayList (누군가 알고있는 경우)에서 어떻게 수행됩니까?

오픈 소스입니다. 상기 source code for ArrayList에서 살펴 보자,이 경우

/** 
* The array buffer into which the elements of the ArrayList are stored. 
* The capacity of the ArrayList is the length of this array buffer. 
*/ 
private transient Object[] elementData; 
+0

아, 오픈 소스라는 걸 몰랐습니다. 잘 했어! 그래서 generics 밑에는 여러 개의 캐스팅이 있습니까? 좋은 재미. 감사! – mtmurdock

+0

@mtmurdock - Java 표준 라이브러리 소스 코드는 첫날부터 무료로 제공됩니다. 자바가 오픈 소스가되기 훨씬 전에. –

+1

@mtmurdock 예, 자바 제네릭은 모두 컴파일 타임 확인 후 잔뜩 캐스팅됩니다. 키워드는 더 많이 읽으려는 경우 "지우기"입니다. – yshavit

0

을, 당신은 개체 유형의 배열을 사용할 수 있습니다, 원인 개체 유형은 모든 것을 수용 할 수 있고, 코드는 같은 간다

public class MySuperCoolList<E> { 
    Object[] array; 

    public MySuperCoolList() { 
     array = new Object[10]; 
    } 

    public E get(int index){ 
     return (E) array[index]; 
    } 

    public void put(int index,E val) { 
     array[index] = val; 
    } 

} 
0
public MySuperCoolList<E>(final Class<? extends E> type) { 
    array = (E[]) Arrays.newInstance(type, 10); 
} 

Arrays.newInstance을 참조하십시오. 이것은 Arrays.copyOf의 작동 방식입니다.

PoC를 배치했습니다 here. 시피

int[] vals = (int[]) Array.newInstance(Integer.TYPE, 10); 
vals[0] = 500; 
System.out.println(vals); 
System.out.println(vals.length); 
System.out.println(Arrays.toString(vals)); 

는 출력은 예상과 같이

[[email protected] 
10 
[500, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
+0

이 문제는 소비자가 클래스를 매개 변수로 전달해야하므로 중복 될 수 있습니다. ArrayList와 같이 작동하는 컬렉션을 만들려고합니다. – mtmurdock

+0

중복? 나는 정말로 그렇게 생각하지 않는다. – oldrinb

+0

생성자에 클래스를 두 번 입력해야한다고 생각하지 않습니까? DRY 내 친구, DRY. – mtmurdock

관련 문제