1. 제네릭의 기본 개념
C#과 마찬가지로 Java는 제네릭의 개념과 유형의 매개 변수화를 가지고 있습니다. Java의 제네릭은 JDK5.0 이후에 나타나지만 Java의 제네릭은 C#의 제네릭과 본질적으로 다릅니다. 우선, 컬렉션 유형의 관점에서 Arraylist <integer> 및 arraylist <string>은 동일한 유형입니다. 편집 중에 유형 지우기가 수행되며 Java의 유형은 유사 유전자입니다. 유사 유전자는 나중에 도입 될 것입니다. 둘째, int와 같은 기본 유형의 데이터를 컬렉션에 추가 할 때 int는 먼저 정수 객체로 변환됩니다. 이는 일반적으로 권투 작업이라고합니다. 요소를 제거 할 때, interger 객체는 INT 값 유형, 즉 Unboxing 작동으로 변환되어야합니다. C#에서 List <int> 및 List <string>은 다른 유형입니다. 일반 매개 변수는 편집 후 자리 표시자가되며 지워지지 않습니다. 런타임에 실제 유형이 할당됩니다. 시스템 런타임 중에 생성되며 자체 가상 메소드 테이블 및 유형 데이터가 있습니다. 이 구현을 유형 인플레이션이라고합니다 (유형 인플레이션의 경우 인스턴트 컴파일러는이 문제를 해결하기 위해 많은 최적화 작업을 수행했습니다). 이것은 소위 진정한 제네릭입니다. 동시에, int와 같은 기본 요소를 컬렉션에 추가 할 때, 상자 할 필요가 없으며 요소를 꺼낼 때는 상자 부스링이 필요하지 않습니다. 따라서 성능은 Java Collection Generics보다 낫습니다.
Java에서 제네릭의 도입은 주로 두 가지 문제를 해결하기위한 것입니다. 1. 유형 교체 예외는 수집 유형 요소의 런타임 중에 발생하며 컴파일 타임 유형 중에 유형 확인이 추가됩니다. 2. 솔루션 중 코드 쓰기를 반복하면 알고리즘을 재사용 할 수 있습니다. 다음은 컴파일러의 유형 검사를 설명하는 예입니다.
먼저 제네릭이 사용되지 않는 예를 살펴 보겠습니다.
ArrayList al = new ArrayList (); al.add ( "ABC"); al.add ( "124"); al.add ( "32L");
AL 컬렉션에 모든 유형의 데이터를 추가 할 수 있습니다. 다음과 같은 데이터를 가져올 때 유형을 변환 해야하는 경우
문자열 s = (문자열) al.get (0); 문자열 s1 = (문자열) al.get (1); // 실행 기간에는 오류 가보고되고 유형 변환 오류는 L = (long) al.get (2)입니다.
이것으로부터 우리는 제네릭이 없을 때 편집 중에 유형 검사가 줄어드는 것을 알 수 있습니다. 요소를 제거 할 때 프로그래머는 각 요소의 유형을 알아야합니다. 그렇지 않으면 런타임에 유형 변환을 제외하고 발생할 수 있습니다.
일반 컬렉션을 통해 우리에게 가져다주는 이점을 살펴 보겠습니다.
ArrayList <string> al1 = new ArrayList <string> (); al1.add ( "abc"); al1.add (1); // 컴파일 중에 오류가 발생했습니다.
String 매개 변수 유형으로 Al1을 인스턴스화하면 int 요소를 추가 할 수 없습니다. 그렇지 않으면 컴파일러가 오류를보고합니다. 일반적으로 Eclipse와 같은 IDE 편집기에는 오류 마크가 있습니다. 동시에 요소를 추출 할 때 변환을 입력 할 필요가 없습니다.
문자열 값 = al1.get (0); // 유형 변환이 필요하지 않습니다
이것이 제네릭의 이점입니다.
그런 다음 알고리즘의 멀티플렉싱은 주로 모든 유형 또는 제한된 유형에서 사용할 수있는 AdtrayList의 추가 방법과 같은 방법의 멀티플렉싱에 반영됩니다.
2. 제네릭 사용
Java의 제네릭은 주로 수업, 방법 및 인터페이스에 사용됩니다. 먼저, 수업의 사용을 간단히 살펴 보겠습니다.
클래스 공장 <t> {개인 T 값; public t getValue () {반환 값; } public void setValue (t v) {this.value = v; }}테스트 방법 추가 :
공장 <string> f = 새로운 공장 <문자열> (); F.setValue ( "사용중인 공장"); System.out.println (f.getValue ());
일반 인터페이스 사용 :
인터페이스 myinterface <t, u> {void show (t t, u u); } class showtest는 myinterface <string, integer> {@override public void show (string t, integer u) {System.out.println (t); System.out.println (u); }}일반 유형 매개 변수가 클래스에서 작용하면 주로 여러 필드와 메소드 서명 사이의 유형 제약 조건을 제한합니다. 메소드에서 작용할 때, 메소드의 여러 매개 변수에서 주요 제약 조건이 이루어집니다. 여기서, 방법의 일반적인 유형 매개 변수는 더 이상 예제되지 않습니다. 아래에 유형 매개 변수의 제약 조건을 주로 소개하겠습니다.
3. 파라미터 유형 제한 조건
다음 코드와 같이 작은 예를 살펴 보겠습니다.
public static <t> t get (t t1, t t2) {if (t1.compareto (t2)> = 0); // 컴파일 오류, 메소드 비교 (t)는 T 형에 대해 정의되지 않습니다. 반환 t1; }컴파일러 오류 메시지를 볼 수 있습니다. 비교 방법은 유형 T에 대해 정의되지 않습니다. 유형을 Java에서 비교 해야하는 경우 비교 가능한 인터페이스를 구현하여 메소드를 재정의해야합니다. 그런 다음 다음과 같은 수정을합니다.
public static <t는 비슷한> t get (t t1, t t2) {// 유형 제한을 추가합니다 (t1.compareto (t2)> = 0); 반환 T1; }적격 t를 비교할 수있게함으로써 t는 비교할 수있는 인터페이스 유형이므로 비교 방법을 구현하므로 컴파일 타임 오류가 없을 것입니다.
유형의 여러 제한 사항을 사용하고 세분화 할 때 제한된 키워드를 사용하고 세분화 할 수 있으며 확장 만 사용할 수 있습니다. 동시에, 인터페이스와 유형이 모두 존재할 때, 클래스는 먼저 배치 할 수 있으며 아래에 표시된 것처럼 하나만 가질 수 있습니다.
<t는 객체 및 비교 및 직렬화 가능>을 확장합니다>
위의 기사는 Java Generics의 역할과 기본 개념에 대해 간략하게 설명합니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.