java generic array how simulate generic arrays java
이 튜토리얼은 Java에서 Object Array를 사용하고 간단한 예제와 함께 Reflection Class를 사용하여 Generic Array의 기능을 시뮬레이션하는 방법을 설명합니다.
우리는 이미 논의했습니다 자바 제네릭 이전 튜토리얼 중 하나에서. Java는 유형에 독립적으로 선언 될 수있는 일반 클래스, 메소드 등을 허용합니다. 그러나 Java는 배열이 일반화되는 것을 허용하지 않습니다.
그 이유는 Java에서 배열은 구성 요소와 관련된 정보를 포함하고이 정보는 런타임에 메모리를 할당하는 데 사용되기 때문입니다. 제네릭이 사용되면 유형 삭제로 인해 바이트 코드에 제네릭 정보가 포함되지 않습니다.
=> 처음부터 Java를 배우려면 여기를 방문하십시오.
학습 내용 :
Java의 일반 배열
일반 배열을 정의한 경우 구성 요소 유형은 런타임에 알려지지 않습니다. 따라서 Java에서 배열을 일반으로 정의하는 것은 권장되지 않습니다.
일반 배열 정의는 다음과 같습니다.
E () newArray = new E(length);
런타임에 유형 정보를 사용할 수 없으므로 컴파일러는 인스턴스화 할 정확한 유형을 알지 못합니다.
따라서 배열 대신 제네릭이 필요할 때마다 Java Collections 프레임 워크의 목록 구성 요소를 선호해야합니다. 그러나 Java의 객체 배열 및 리플렉션 기능을 사용하여 배열과 유사한 일반 구조를 만들 수 있습니다.
서로 다른 데이터 유형의 배열을 정의 할 수있는이 두 가지 접근 방식은 아래에서 자세히 설명합니다.
휴대폰 용 최고의 스파이 앱
일반 배열 생성 및 초기화
이 섹션에서는 본질적으로 일반적인 배열과 유사한 구조를 만들어 보겠습니다. 이러한 구조를 사용하면 데이터 유형을 인수로 제공하여 배열을 만들 수 있습니다.
객체 배열 사용
이 접근 방식은 Objects 유형의 배열을 기본 배열 클래스의 멤버로 사용합니다. 또한 get / set 메서드를 사용하여 배열 요소를 읽고 설정합니다. 그런 다음 필요에 따라 데이터 유형을 제공 할 수있는 기본 배열 클래스를 인스턴스화합니다.
이것은 일반 배열을 시뮬레이션합니다.
다음 프로그램은 객체 배열을 사용하여 Generic 배열과 유사한 구조를 만드는 방법을 보여줍니다.
import java.util.Arrays; class Array { private final Object() obj_array; //object array public final int length; // class constructor public Array(int length) { // instantiate a new Object array of specified length obj_array = new Object (length); this.length = length; } // get obj_array(i) E get(int i) { @SuppressWarnings('unchecked') final E e = (E)obj_array(i); return e; } // set e at obj_array(i) void set(int i, E e) { obj_array(i) = e; } @Override public String toString() { return Arrays.toString(obj_array); } } class Main { public static void main(String() args){ final int length = 5; // creating integer array Arrayint_Array = new Array(length); System.out.print('Generic Array :' + ' '); for (int i = 0; i 산출:
위의 프로그램에서 우리는 일반적인 Array 클래스를 정의했습니다. 객체 배열은 생성자와 길이를 사용하여 인스턴스화되는 클래스의 멤버입니다. 또한 특정 유형의 배열 요소를 읽고 설정하는 데 사용되는 일반 get 및 set 메소드를 사용합니다.
그런 다음이 배열 클래스의 인스턴스를 만듭니다. 인스턴스를 생성하는 동안 원하는 유형을 지정할 수 있습니다. 위의 프로그램에서 Integer와 String 유형의 배열 두 개를 만든 다음 이러한 배열을 적절한 값으로 채 웁니다 (set 메서드 사용).
마지막으로 재정의 된‘toString’메서드를 사용하여 이러한 각 인스턴스의 내용을 표시합니다.
반사 사용
이 접근 방식에서는 리플렉션 클래스를 사용하여 유형이 런타임에만 알려진 제네릭 배열을 만듭니다.
접근 방식은 이전 접근 방식과 유사하지만 한 가지 차이점이 있습니다. 즉, 생성자 자체에서 리플렉션 클래스를 사용하여 데이터 유형 정보를 클래스 생성자에 명시 적으로 전달하여 객체 배열을 인스턴스화합니다.
이러한 유형의 정보는 리플렉션의 Array.newInstance 메서드에 전달됩니다.
다음 프로그램 일반적인 배열을 생성하기위한 리플렉션의 사용법을 보여줍니다. . 전체 프로그램 구조는 리플렉션 기능 사용의 차이 만 제외하면 이전 접근 방식과 유사합니다.
importjava.util.Arrays; class Array { private final E() objArray; public final int length; // class constructor public Array(ClassdataType, int length){ // create a new array with the specified data type and length at runtime using reflection this.objArray = (E()) java.lang.reflect.Array.newInstance(dataType, length); this.length = length; } // get element at objArray(i) Eget(int i) { returnobjArray(i); } // assign e to objArray(i) void set(int i, E e) { objArray(i) = e; } @Override public String toString() { return Arrays.toString(objArray); } } class Main { public static void main(String() args){ final int length = 5; // create array with Integer as data type Arrayint_Array = new Array(Integer.class, length); System.out.print('Generic Array:' + ' '); for (int i = 0; i 산출:
위 프로그램은 Arrays 제네릭 클래스에서 생성 된 Integer와 String의 두 가지 유형의 배열을 보여줍니다.
일반 어레이 생성 오류
우리는 이미 Java에서 일반 배열을 생성 할 때의 의미와 Java에서 일반 배열을 사용할 수없는 이유에 대해 논의했습니다. 이것에 대한 또 다른 설명은 Java의 배열은 공변이지만 제네릭은 그렇지 않다는 것입니다. 제네릭은 변하지 않습니다.
공분산이란 하위 유형의 배열이 상위 유형 참조에 할당 될 수 있음을 의미합니다.
Windows 7을위한 최고의 PC 클리너
이것은 다음 문장이 잘 작동 함을 의미합니다.
Number numArray() = new Integer(10);
Integer는 Number의 하위 유형이므로 위의 문은 잘 컴파일됩니다.
그러나 제네릭과 동일한 개념을 사용하면 제네릭에서 작동하지 않습니다. 즉, 제네릭 하위 유형을 상위 유형 제네릭에 할당 할 수 없습니다.
문, ListobjList = new ArrayList (); 제네릭은 배열과 같이 공변 적이 지 않으므로 컴파일 오류가 발생합니다.
위의 이유를 염두에두고 아래와 같은 것도 가질 수 없습니다.
public static ArrayList() myarray = new ArrayList(2);
이 문은 오류와 함께 컴파일되지 않습니다. '일반 어레이 생성' 특정 제네릭 유형에 대한 참조 배열을 선언 할 수 없기 때문입니다.
그러나 와일드 카드를 사용하여 특정 제네릭 유형에 대한 참조 배열을 만들 수 있습니다. 위의 문은 아래와 같이 와일드 카드 사용을 약간 변경하여 성공적으로 컴파일 할 수 있습니다.
public static ArrayListmyarray = new ArrayList(5);
위의 문은 성공적으로 컴파일됩니다.
다음 프로그램은 와일드 카드 사용 데모를 보여줍니다.
예제가 포함 된 요구 사항 추적 성 매트릭스 템플릿
import java.util.*; //generic array class classArr { T tarray(); Arr(T myarray()) { tarray = myarray; } @Override public String toString() { return Arrays.toString(tarray); } } public class Main { public static void main(String() args) { // Arrtarray() = new Arr(5); //error: generic array creation //initialize new array objects Arr arr1 = new Arr(new Integer(){2,4,6,8,10}); System.out.print('Array with Integer type:' + ' '); System.out.println(arr1); Arr arr2 = new Arr(new String(){'aa', 'bb', 'cc', 'dd'}); System.out.print('Array with String type:' + ' '); System.out.println(arr2); //define array objects using wildcard Arrarr3() = new Arr(5); arr3(0) = new Arr(new Integer(){10, 20, 30, 40, 50}); System.out.println('Integer array: ' + arr3(0)); arr3(1) = new Arr(new Float(){1.1f, 2.2f, 3.3f, 4.4f, 5.5f}); System.out.println('Float array: ' + arr3(1)); } }
산출:
위의 프로그램에서 우리는 제네릭의 불변성을 나타내는 메인 메소드의 첫 번째 문장을 가지고 있습니다. 이 문은 컴파일 오류 (주석에 표시됨)를 깜박입니다. 다음 배열 생성은 제네릭 규칙에 따라 수행되므로 성공적으로 컴파일됩니다.
자주 묻는 질문
Q # 1) Generic Array 란 무엇입니까?
대답: 데이터 유형과 독립적이고 런타임에 정보 유형이 평가되는 배열은 일반 배열입니다. 제네릭은 C ++의 템플릿과 유사합니다.
Q # 2) Java에서 Generic Array를 만들 수 있습니까?
대답: 배열은 Java에서 공변합니다. 즉, 모든 하위 클래스 배열을 수퍼 유형 배열에 할당 할 수 있습니다. 그러나 제네릭은 변하지 않습니다. 즉, 서브 클래스 유형 배열을 수퍼 클래스 유형에 할당 할 수 없습니다.
둘째, 제네릭 정보가 JVM에서 제거되므로 런타임에 메모리 할당이 수행되는 어레이는 어레이에 할당 될 유형을 알지 못합니다. 따라서 배열과 제네릭은 Java에서 잘 어울리지 않습니다.
Q # 3) Java에서 Type E는 무엇입니까?
대답: 제네릭의 자리 표시 자 역할을하며 모든 유형의 요소를 나타냅니다.
Q # 4) Java에서 Type Erasure 란 무엇입니까?
대답: 제네릭에 사용 된 매개 변수화 된 유형이 제거되고 바이트 코드의 원시 유형에 매핑되는 Java 컴파일러가 수행하는 프로세스입니다. 따라서 바이트 코드에는 제네릭에 대한 정보가 포함되어 있지 않습니다.
Q # 5) Java에서 원시 유형이란 무엇입니까?
대답: 원시 유형은 type 매개 변수를 사용하지 않는 일반 유형입니다. 예 : 목록은 원시 유형입니다. 반면 List는 매개 변수화 된 유형입니다.
결론
Java에서는 일반 배열을 직접 정의 할 수 없습니다. 즉 배열 참조에 매개 변수화 된 유형을 할당 할 수 없습니다. 그러나 객체 배열 및 반사 기능을 사용하여 일반 배열 생성을 시뮬레이션 할 수 있습니다.
이 튜토리얼에서 일반적인 어레이 생성 오류에 대한 세부 정보 및 이러한 오류를 방지 할 수있는 가능성과 함께이 두 가지 접근 방식을 살펴 보았습니다. 간단히 말해서, Java에서는 배열이 공변하는 반면 제네릭은 불변하기 때문에 배열과 제네릭이 함께 사용되지 않는다고 말할 수 있습니다.
=> 여기에서 완벽한 Java 교육 가이드를 확인하십시오.
추천 도서