자바 범형의 작용과 그 기본 개념을 간단히 말하다

1. 범형의 기본 개념
java는 c#와 마찬가지로 범용 개념과 유형의 매개 변수화가 존재한다.자바의 범주형은 jdk5.0 이후에 나타났지만 자바의 범주형은 C#의 범주형과 본질적인 차이가 있다. 먼저 집합 유형에서 말하자면 자바의 ArrayList와 ArrayList은 같은 유형으로 컴파일할 때 유형을 지우고 자바의 유형은 위범형이다. 위범형은 다음에 소개할 것이다. 그 다음에 집합에 기본 유형의 데이터를 추가할 때 예를 들어 int,먼저 int를 Integer 대상, 즉 우리가 일반적으로 말하는 포장 작업으로 전환합니다. 요소를 꺼낼 때 Interger 대상을 int값 형식, 즉 해체 작업으로 전환해야 합니다.한편, c#에서 List 와 List 은 서로 다른 유형이다. 범용 매개 변수는 컴파일한 후에 자리 차지 문자가 되고 지워지지 않으며 실행할 때 진정한 유형이 부여된다. 그들은 시스템 운행 기간에 생성되고 자신의 허법표와 유형 데이터가 있다. 이런 실현을 유형 팽창이라고 부른다(유형 팽창에 대해 실시간 컴파일러는 이 문제를 해결하기 위해 많은 최적화 작업을 했다).이것이 바로 이른바 진범형이다.이와 동시에 집합에 기본 요소인 int를 추가할 때 컨테이너 작업이 필요하지 않고 요소를 꺼낼 때 컨테이너 작업이 필요하지 않기 때문에 성능상 자바의 집합 범위보다 좋다.
java에서 범용적인 도입은 주로 두 가지 측면의 문제를 해결하기 위한 것이다. 1.집합 유형 요소는 운행 기간에 유형 교체 이상이 발생하고 컴파일할 때 유형 검사를 증가합니다. 2.해결할 때 중복 코드의 작성은 알고리즘을 복용할 수 있다.다음은 예를 통해 컴파일러의 유형 검사를 설명합니다.
우선 우리는 범용형을 사용하지 않은 예를 하나 본다.

ArrayList al = new ArrayList(); 
  al.add("abc"); 
  al.add("124"); 
  al.add("32L"); 
우리는 알 집합에 어떤 종류의 데이터를 추가할 수 있다.데이터를 추출할 때 다음과 같은 유형 변환이 필요합니다.

String s = (String)al.get(0);
String s1 = (String)al.get(1); // , , 
Long l = (Long)al.get(2);
이를 통해 알 수 있듯이 범용이 없을 때 컴파일할 때의 유형 검사를 줄이고 원소를 꺼낼 때 프로그래머가 모든 원소의 유형에 대해 알아야 한다. 그렇지 않으면 실행할 때 유형 전환의 이상이 발생할 수 있다.
 
그럼 다음은 범용 집합을 통해 그가 우리에게 가져다 준 이익을 살펴보자.

ArrayList<String> al1 = new ArrayList<String>();
al1.add("abc");
al1.add(1);  // ,
String 매개 변수 형식으로al1을 실례화한 후에 int 요소를 추가할 수 없습니다. 그렇지 않으면 컴파일러가 오류를 보고합니다. 보통 IDE 편집기, 예를 들어 eclipse에 오류 표시가 있을 뿐만 아니라 요소를 꺼내도 형식 변환이 필요하지 않습니다.

string value = al1.get(0); // 
이것이 바로 범형이 가져온 장점이다.
그러면 알고리즘의 복용은 주로 방법의 복용, 예를 들어 ArrayList의Add 방법은 어떤 유형이나 한정된 유형에 사용할 수 있다는 데 나타난다.
2. 범용 사용
java의 범주형은 주로 클래스, 방법, 인터페이스에 사용된다.우선, 우리는 클래스에서의 사용을 간단하게 살펴보자.

class Factory<T>{ 
  private T value; 
  public T getValue() 
  { 
    return value; 
  } 
  public void setValue(T v) 
  { 
    this.value = v; 
  } 
} 
테스트 방법 추가:

Factory<String> f = new Factory<String>(); 
f.setValue("factory in use"); 
System.out.println(f.getValue()); 
범용 인터페이스 사용:

interface MyInterface<T,U>{ 
 
  void show(T t, U u); 
} 
 
class ShowTest implements 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);//  ,the method compareTo(T) is undefined for the type T. 
  return t1;  
} 
컴파일러가 잘못 보고한 정보를 볼 수 있습니다. 유형 T에 대해compareTo 방법을 정의하지 않았습니다. 자바에서 유형을 비교해야 하면Comparable 인터페이스를 실현하여 이 방법을 다시 써야 합니다.그러면 다음과 같이 수정합니다.

public static <T extends Comparable> T get(T t1,T t2) { //   
    if(t1.compareTo(t2)>=0);  
    return t1;  
  } 
한정 T extends Comparable를 통해 T는 Comparable의 인터페이스를 실현하는 유형이기 때문에compareTo 방법도 실현되었기 때문에 컴파일링 오류가 발생하지 않습니다.
유형이 여러 개 한정될 때 우리는 & 를 사용하여 분할할 수 있으며, 한정된 키워드는 extends만 사용할 수 있다.이와 동시에 인터페이스와 유형이 모두 존재하는 상황에서 클래스는 첫 번째에 놓을 수 있고 다음과 같은 하나만 있을 수 있다.

<T extends Object&Comparable&Serializable> 
이상의 자바 범형의 역할과 그 기본 개념은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기