Collection
클래스는 2 toArray()
메서드는 <T> T[] toArray(T[] a)
및 Object[] toArray()
입니다. E[] toArray()
방법이 없습니다. 왜? 유형 지우기와 연결되어 있지만, 예를 들어 방법 - boolean add(E e)
이 있습니다. add
을 매개 변수화 할 수있는 이유는 무엇이며 toArray()
메서드를 만들 수 없습니까?Collection 클래스의 toArray() 메서드
답변
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;
}
}
,하지만 우리는 거라고 toArray
이 String
(유일한 요소)을 Integer
번으로 캐스팅하려고 시도했을 때 ClassCastException
이 표시됩니다.
맞습니까? 곧 :'add' 메쏘드는 컴파일러에 의해 검사 될 수 있으므로, 매개 변수화 된 타입이 될 수 있습니다. 'toArray' 메서드는 컴파일러에서 검사 할 수도 있지만 형식 지움으로 인해 반환 된 형식은 항상 Object 배열이되므로 아무 것도 제공하지 않습니까? 그것은 창조 될 수 있지만 쓸모가 없을 것입니다. 매개 변수 형은'add' 메쏘드에 있습니다. 왜냐하면 컴파일러가 매개 변수를 검사 할 수 있고 유용하기 때문입니다. – Pawel
@Pawel : 일종의. 그것은 실제로 점검 할 수있는 일과 * when * 일과 관련이 있습니다. 나는 당신의 생각을 정확하게 따라갈 것이라고 확신하지는 않지만 바라건대 그들은 대답과 일치한다. –
- 1. Vector <> 클래스의 toArray() 메서드
- 2. ClassCastException toArray() 메서드 사용에서
- 3. Linq ToArray ToArray 오류
- 4. arrylist를 toarray 메서드 또는 다른 배열로 변환하십시오.
- 5. 메서드 toArray()가 목록에서 작동하지 않습니다.
- 6. Collection 클래스의 이상한 제어 문
- 7. 다른 클래스의 Collection getter를 사용하는 일반 클래스
- 8. Mongodb toArray() performance
- 9. MongoDB를 toArray
- 10. Generics, ToArray etc.
- 11. 기본 클래스의 일반 메서드 포인터를 사용하여 파생 클래스의 메서드 호출
- 12. System.Object 클래스의 메서드 완료
- 13. 중첩 클래스의 메서드 노출
- 14. Win32Shutdown Win32_OperatingSystem 클래스의 메서드
- 15. 익명 클래스의 메서드 사용
- 16. 클래스의 가상 메서드
- 17. 다른 클래스의 메서드 호출
- 18. Person 클래스의 메서드 작성
- 19. 다른 클래스의 메서드 구현
- 20. 익명 내부 클래스의 메서드
- 21. 클래스의 WCF 정적 메서드
- 22. 다른 클래스의 메서드 호출
- 23. 정적 메서드 클래스의 생성자
- 24. 클래스의 인스턴스에서 오버라이드 메서드
- 25. SKScene 클래스의 호출 메서드
- 26. 다른 클래스의 메서드 호출
- 27. 다른 클래스의 스레딩 메서드?
- 28. 클래스의 메서드 배치
- 29. 다른 클래스의 메서드 사용
- 30. DLL 클래스의 메서드 사용
백틱이 조금 만족 스럽습니까? – csmckelvey
더 설명해 주시겠습니까? backtick의 문제점 : p? – Pawel
아무 잘못 없습니다, 그냥 힘든 시간을 보내고있어 :) 작은 공간에서 그렇게 많은 사람들을 보는 것은 드문 일입니다. – csmckelvey