Java ArrayList.toArray(T[]) 방법의 매개 변수 유형은 E가 아닌 T의 원인 분석
Javapublic class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
이 종류의 toArray(T[]a) 방법은 generic method입니다. 이것은 이렇게 설명하고 실현됩니다.
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
이 방법은 사실상 Collection 인터페이스에서 설명한 것이다.우리는 자주 Array List를 통해 그것을 사용하기 때문에, 여기에는 Array List를 예로 들 수 있다.1 왜 다른 유형으로 선언합니까?
내 질문: 왜 이 방법은 유형 T를 사용하고 ArrayList의 유형 E를 사용하지 않습니까?즉, 이 방법은 왜 이렇게 성명하지 않는가.
Javapublic E[] toArray(E[] a);
만약 형식이 같다면, 컴파일하는 동안 매개 변수의 형식 오류를 발견할 수 있습니다.유형이 다르면 실행 중 오류가 발생하기 쉽습니다.예를 들어 아래의 코드:
// String ArrayList
List<String> strList = new ArrayList<String>();
strList.add("abc");
strList.add("xyz");
// strList Number 。 , 。
Number[] numArray = strList.toArray(new Number[0]);
위의 코드를 실행하면 라인 6가java를 던집니다.lang. ArrayStoreException 예외.ToArray 메서드에서 유형 E를 사용하면 문장 2에서 컴파일 오류가 발생합니다.번역 오류는 아무래도 운행 오류보다 친절하군요.그리고generics의 주요 목적은 형식 안전을 위해 형식 변환 오류(ClassCastException)를 컴파일하는 동안 없애는 것이다.이 방법은 도리를 거꾸로 행하였다.설마 이게 큰 버그야?자바의 버그는 내가 만났지만, 이곳에서 버그가 나온다는 것은 나는 아직 그다지 믿을 수 없다.
인터넷에 접속해 보니 이 문제는 이미 여러 차례 토론되었다. 2, 3, 4.
2 유연성 향상
이러한 성명은 현재list의 요소를 더욱 일반적인 유형의 그룹으로 변환할 수 있는 유연성을 가진다.예를 들어 현재list의 유형은 Integer입니다. 우리는 그것의 요소를 하나의 Number 그룹으로 변환할 수 있습니다.
List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
Number[] numArray = intList.toArray(new Number[0]);
만약 이 방법이 유형 E로 성명된다면, 위의 코드는 컴파일 오류가 있을 것이다.보기에 이 방법은 다음과 같이 성명하는 것이 더욱 적합할 것 같다.
Javapublic <T super E> T[] toArray(T[] a);
그러나 코드 1:
List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
Float[] floatArray = new Float[2];
//Float Number , Float[] Number[]
Number[] numArray = floatArray;
// ArrayStoreException
numArray = intList.toArray(numArray);
코드 2:
List<Number> intList = new ArrayList<Number>();
//List Number。 Number ,
intList.add(new Integer());
intList.add(new Integer());
Float[] floatArray = new Float[];
//Float Number , Float[] Number[]
Number[] numArray = floatArray;
// ArrayStoreException
numArray = intList.toArray(numArray);
위의 이상은 모두 이 사실로 인해 발생한 것이다. 만약에 A가 B의 부류라면 A[]는 B[]의 부류이다.Java의 모든 클래스는 Object에서 상속되며 Object[]는 모든 배열의 상위 클래스입니다.이 글은 8에서 예를 들어 이 방법의 유형이 E로 밝혀져도 ArrayStore Exception 이상을 피할 수 없다는 것을 설명한다.
이 방법의 문서에서도 이 이상이 언급되었다.
ArrayStoreException if the runtime type of the specified array is not a supertype of the runtime type of every element in this list.
3 Java 1.5 이전 버전과 호환 가능이 방법은 자바가 Generics를 도입하기 전에 (JDK1.5에서 Generics를 도입했다) 9가 나왔다.그때 그것은 이렇게 성명되었다.
Javapublic Object[] toArray(Object[] a)
Generics가 등장한 후, 많은 종류와 방법들이generic로 변했다.이 방법도 대세에 따라 이렇게 성명되었다.
Javapublic <T> T[] toArray(T[] a)
이렇게 하면 Java 1.5 이전 버전과 10을 호환할 수 있습니다.4 잔소리 두 마디
이 방법은 수조 파라미터가 필요하다.만약 이 그룹의 길이가 현재list의size보다 크거나 같으면list의 요소는 이 그룹에 저장됩니다.이 그룹의 길이가 현재list의size보다 작으면 새 그룹을 만들고 현재list의 요소를 이 새로 만든 그룹에 저장합니다.효율을 높이기 위해서, 가능하다면, 전송된 그룹의 길이는list의size보다 크거나list의size보다 커서, 이 방법으로 새 그룹을 만드는 것을 피해야 합니다.
List<Integer> intList = new ArrayList<Integer>();
intList.add();
intList.add();
// ,
Number[] numArray = intList.toArray(new Number[]); //
// , intList
Number[] numArray = intList.toArray(new Number[intList.size()]); //
또한 매개 변수인 그룹은null일 수 없습니다. 그렇지 않으면 NullPointerException 이상이 발생합니다.Footnotes:
일
Effective Java (2nd Edition)
이
Link
삼
Link
사
Link
오
Link
육
Link
칠
Link
팔
Link
구
Link
십
Link
Created: 2016-04-06 Wed 21:14
Emacs 24.5.1 (Org mode 8.2.10)
Validate
위의 내용은 여러분에게 소개할 Java Array List입니다.toArray(T[]) 방법의 매개 변수 유형은 E가 아닌 T의 원인 분석입니다. 여러분에게 도움이 되기를 바랍니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java의 ArrayList 작동 원리 상세 정보수조로 실현하다.공간을 절약하지만 수조는 용량 제한이 있다.제한을 초과하면 50% 용량이 증가하며 System을 사용합니다.arraycopy () 를 새 그룹으로 복사합니다.따라서 수조 크기의 예비 평가를 하는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.