2014-09-22 5 views
3

Java에서 2 차원 제네릭 배열을 만들려고했습니다. 나는 어떤 컴파일 오류를 얻을 수 없지만, 코드를 실행할 때 나는 예외가 : 나는 두 차원 배열이 방법을 사용할 수없는 것 같습니다2 차원 제네릭 배열 초기화

import java.lang.reflect.Array; 

public class Tabela<T> { 

    private T[][] data; 

    public Tabela(Class<T[][]> c,int sizeX, int sizeY) { 
     this.data = c.cast(Array.newInstance(c.getComponentType(), sizeX, sizeY)); 
    } 

    public void setInfoAt(T info, int x, int y) { 
     this.data[x][y] = info; 
    } 
    public T getObjectAt(int x, int y) { 
     return this.data[x][y]; 
    } 
} 

public class TabelaTest { 

    public static void main(String args[]) { 
     Tabela<String> tabela = new Tabela<String>(String[][].class, 2, 2); 

     tabela.setInfoAt("a", 0, 0); 
     tabela.setInfoAt("b", 0, 1); 
     tabela.setInfoAt("c", 1, 0); 
     tabela.setInfoAt("d", 1, 1); 

     System.out.println(tabela.getObjectAt(1, 0)); 
    } 
} 

: 여기

Exception in thread "main" java.lang.ClassCastException: Cannot cast [[[Ljava.lang.String; to [[Ljava.lang.String; 
at java.lang.Class.cast(Unknown Source) 
at Tabela.<init>(Tabela.java:8) 
at TabelaTest.main(TabelaTest.java:4) 

는 코드입니다.

편집 :

unholysampler의 방법을 사용하면 이제 작동합니다. 생성자로 변경되었습니다 것은 일식이 캐스트 (T [] [])에 대해 내게 경고 유지입니다

public Tabela(Class<T> c,int sizeX, int sizeY) { 
    this.data = (T[][])Array.newInstance(c, sizeX, sizeY); 
} 

. 나는 그것을 억누를 수 있지만, 무시해도 될까요? componentType가 배열 클래스 새로운 배열 가 dimensions.length의 합 componentType 치수의 수와 동일한 차원 수를 나타내는 경우

답변

5

.

Cannot cast [[[Ljava.lang.String; to [[Ljava.lang.String; 
      ---      -- 

Array.newInstance()을 호출하기 때문에 추가 배열 수준으로 끝납니다. 당신은 단지 String 배열을 만들고 싶었 경우 사용합니다 : 당신이 기본 클래스의 종류와 방법을 전달

String[] arr = (String[])Array.newInstance(String.class, 5); 

공지 사항 브라켓의 레이어를 "추가". 두 번째 배열의 인스턴스가 String 인 배열을 원한다는 전화가 왔습니다. 대신 기본 클래스를 정상적으로 전달한 다음 차원을 지정해야합니다.

Array.newInstance(String.class, sizeX, sizeY); 
+0

미안하지만 실제로 얻지 못했습니다. 나는 T. [] [] 대신에 T로 Array.newInstance를 호출해야한다는 것을 이해하고있다. – lhahn

+0

예. 왜냐하면 Array.newInstance는 2D 배열을 만드는 작업을하기 때문입니다. – NoDataFound

+0

덕분에 이제는 효과가있었습니다. – lhahn

1

Array#newInstance(..)의 Javadoc가

을 말한다. 이 경우 구성 요소 유형이 인 새 배열은 componentType의 구성 요소 유형입니다. componentTypeString[] 배열 클래스이므로

은 차원의 수가 3의 총 dimensions.length, 2의 합과 componentType, 1 치수의 개수가된다.

귀하의 호출은

Array.newInstance(c.getComponentType(), sizeX, sizeY) 

당신은, 대신,

new String[2][] 
을 만들

Array.newInstance(c.getComponentType(), sizeX) 

newInstance(Class, int) 메소드를 호출 할 수

new String[2][2][] 

에 해당된다

하지만 중첩 배열을 수동으로 인스턴스화해야합니다.

unholysampler's solution을 구현하거나 생성자 매개 변수를 리팩터링하십시오.

2

이 오류는 생성자에 있습니다

public Tabela(Class<T[][]> c,int sizeX, int sizeY) { 
     this.data = c.cast(Array.newInstance(c.getComponentType(), sizeX, sizeY)); 
} 
  • c.getComponentType() 실제로 T[]이다.
  • Array.newInstance(Class, int...) 배열에있는만큼 많은 차원의 배열을 반환합니다. 두 값을 전달하면 배열은 2 차원 값입니다.그것은 (유형 소거) 할 수만 있으면 new T[sizeX][sizeY][]에 런타임 동등한 것

    Array.newInstance(
        c.getComponentType(), // returns T[] 
        sizeX, sizeY 
    ) // returns T[][][] 
    

.

나는 그렇게 할 것입니다 : 오류 메시지를 보면, 당신은 대괄호의 숫자가 다른 것을 볼 수

public Tabela(Class<T> c,int sizeX, int sizeY) { 
     this.data = Array.newInstance(c, sizeX, sizeY); 
}