2014-01-23 3 views
5

Collection 클래스는 2 toArray() 메서드는 <T> T[] toArray(T[] a)Object[] toArray()입니다. E[] toArray() 방법이 없습니다. 왜? 유형 지우기와 연결되어 있지만, 예를 들어 방법 - boolean add(E e)이 있습니다. add을 매개 변수화 할 수있는 이유는 무엇이며 toArray() 메서드를 만들 수 없습니까?Collection 클래스의 toArray() 메서드

+0

백틱이 조금 만족 스럽습니까? – csmckelvey

+0

더 설명해 주시겠습니까? backtick의 문제점 : p? – Pawel

+0

아무 잘못 없습니다, 그냥 힘든 시간을 보내고있어 :) 작은 공간에서 그렇게 많은 사람들을 보는 것은 드문 일입니다. – csmckelvey

답변

11

E [] toArray() 메소드가 없습니다. 왜? 이 삭제를 입력 할 예정 만들 배열의 유형을 알고하지 않기 때문에

, 그것은 실제로가 실행 시간에 E[] 만들 수있는 방법은 없습니다.

add 방법은 정말 것을 허용하지만 컴파일러는 인수의 형태가 처음 E와 호환되는지 확인합니다. 실행 시간에 아무 것도 알려질 필요가 없습니다.

List<String> strings = new ArrayList<>(); 
strings.add("hello"); 
String first = strings.get(0); 

이 사전 제네릭 코드와 같은 코드로 컴파일한다 : 마찬가지로 List.get 같은 뭔가를, 컴파일러는 으로 캐스팅 코드를 호출 삽입

List strings = new ArrayList(); 
strings.add("hello"); 
String first = (String) strings.get(0); 

이제 여기 괜찮습니다, 호출 코드에서 실행 시간에 String 유형을 알고 있기 때문에 ... toArray()에 배열을 작성하는 코드는 유형을 알아야하고 ... 유형 삭제는 실제로 그 사실을 알지 못한다는 것을 의미합니다. toArray()에 전달 된 배열을 사용하면 동일한 유형의 배열을 만들 수 있습니다. 실제로, 생성 된 객체의 실제 유형은 전달 배열에 의존 표시 할 수 있습니다 : 우리가 new Integer[0] 전달했다면이 를 컴파일 할 것이다

import java.util.*; 

public class Test { 

    public static void main(String[] args) { 
     List<Object> objects = new ArrayList<Object>(); 
     objects.add("xyz"); 

     Object[] array1 = objects.toArray(new String[0]); 
     Object[] array2 = objects.toArray(new Object[0]); 
     System.out.println(array1.getClass()); // class [Ljava.lang.String; 
     System.out.println(array2.getClass()); // class [Ljava.lang.Object; 
    } 
} 

,하지만 우리는 거라고 toArrayString (유일한 요소)을 Integer 번으로 캐스팅하려고 시도했을 때 ClassCastException이 표시됩니다.

+0

맞습니까? 곧 :'add' 메쏘드는 컴파일러에 의해 검사 될 수 있으므로, 매개 변수화 된 타입이 될 수 있습니다. 'toArray' 메서드는 컴파일러에서 검사 할 수도 있지만 형식 지움으로 인해 반환 된 형식은 항상 Object 배열이되므로 아무 것도 제공하지 않습니까? 그것은 창조 될 수 있지만 쓸모가 없을 것입니다. 매개 변수 형은'add' 메쏘드에 있습니다. 왜냐하면 컴파일러가 매개 변수를 검사 할 수 있고 유용하기 때문입니다. – Pawel

+0

@Pawel : 일종의. 그것은 실제로 점검 할 수있는 일과 * when * 일과 관련이 있습니다. 나는 당신의 생각을 정확하게 따라갈 것이라고 확신하지는 않지만 바라건대 그들은 대답과 일치한다. –