2012-03-15 4 views
1

openjdk의 java.util.Arrays에서이 코드를 이해하는 데 문제가 있습니다. 나는 왜이 코드가 reflection (Array.newInstance)을 사용하는지, 왜 형식이 같은지 확인하는 이유는 무엇인지 궁금하다. T와 U 유형이 다르더라도 왜 T [] copy = (T []) new Object [newLength]를 할 수 없습니까?Java에서 Arrays.copyOf 소스 코드가 왜 리플렉션을 사용합니까?

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { 
    T[] copy = ((Object)newType == (Object)Object[].class) 
     ? (T[]) new Object[newLength] 
     : (T[]) Array.newInstance(newType.getComponentType(), newLength); 
    System.arraycopy(original, 0, copy, 0, 
        Math.min(original.length, newLength)); 
    return copy; 
} 
+0

왜 Array.newInstance가 리플렉션이라고 생각하십니까? AIUI 그것은 매개 변수화 된 클래스의 배열을 생성하는 "일반적인"방법 일뿐입니다. –

+2

@Andrzej 클래스는'java.lang.reflect' 패키지의 일부로, 왜 내가 반성을 취한 것인지 꽤 좋은 논쟁으로 생각합니다. 실제로는 네이티브 메소드입니다 - 아마도 JVM 내장 함수 일 수도 있습니다. – Voo

+0

@Voo Touché, 나는 그 패키지를 알아 차리지 못했다. (자동 가져 오기로 모든 IDE를 쉽게 만들 수있다 ... :)). –

답변

4

수 -하지만 당신은 당신이 String[]에 대해 물었다 경우에도 Object[]로 끝날 것입니다.

String[] strings = Arrays.copyOf(existingArray, 10, String[].class); 
Object[] objects = strings; 
objects = new Object(); 

을 ...하지만 하지Array.copyOf 경우는 항상 실제로 Object[]을 반환 것입니다 : 그래서이 이 실패합니다.

+0

오타 : 마지막 줄에 'objects'색인을 지정해야합니다 (예 : 'objects [0] = new Object(); ' – pnkfelix

0

배열을 new T[newLength]과 같은 제네릭 형식에서 인스턴스화 할 수 없습니다. 그래서 당신이 할 수있는 일은 new Object[newLength]입니다. 그러나 Array는 ArrayStoreException을 throw 할 수 있기 위해 항목 유형에 대한 정보를 저장합니다.이 경우 잃게됩니다.

+0

'new T []'조차도 스펙과 일치하지 않습니다. –

관련 문제