자바 범 형 독서 노트(1)
자바 SE7 과 그 후의 버 전에 서 new 의 일반적인 인 스 턴 스 를 사용 할 때 형식 매개 변 수 를 입력 하지 않 을 수 있 습 니 다.자바 컴 파일 러 는 부 여 된 변수 형식 성명 을 통 해 다음 코드 를 추정 할 수 있 기 때 문 입 니 다.
ArrayList<String> files = new ArrayList<>();
컴 파 일 러 는 자동 으로 String 을 Array List 의 일반적인 클래스 인자 에 전달 합 니 다.
범 형 류 는 일반 류 의 한 공장 으로 나타 나 는데 범 형 류 는 서로 다른 유형의 매개 변 수 를 전달 함으로써 서로 다른 종 류 를 생산 할 수 있다.
일반 형식의 경계
다음 코드 를 사용 하여 범용 T 의 경 계 를 정의 할 수 있 습 니 다.
<T extends BoundingType>
여기 서 T 확장 자 를 Bounding Type 에서 정의 합 니 다.이 Bounding Type 은 인터페이스 일 수도 있 고 클래스 일 수도 있 습 니 다.
하나의 형식 매개 변수 나 어댑터?다음 코드 와 같은 여러 개의 경계 가 있 을 수 있 습 니 다.
T extends Comparable & Serializable
서로 다른 경 계 는&기 호 를 사용 하여 분리 되 고 이런 경계 중 하 나 는 클래스 일 수 있 으 며 다른 것 은 모두 인터페이스,즉 자바 의 계승 체제 와 같다.또한 하나의 클래스 를 경계 로 한다 면 extends 뒤의 첫 번 째 위치 에 쓰 고 뒤에 인 터 페 이 스 를 써 야 합 니 다.
범용 매개 변수 지우 기
일반적인 형식 을 정의 할 때 자바 는 자동 으로 원본 형식 을 제공 합 니 다.이 원본 형식의 이름 은 일반적인 이름 이 없 으 며 자바 컴 파일 러 는 형식 매개 변 수 를 지우 고 일반 형식 으로 변 합 니 다.
일반 형식 T 가 경 계 를 정의 하지 않 으 면 Object 로 바 꾸 는 것 이 원칙 입 니 다.경계 가 있 으 면 경계 로 교체 합 니 다.
다음 코드 는 Pair
public class Pair<T>
{
private T second;
private T first;
public Pair()
{
first = null;
second = null;
}
public Pair(T first, T second)
{
this.first = first;
this.second =second;
}
public T getFirst()
{
return first;
}
public T getSecond()
{
return second;
}
public void setFirst(T newValue)
{
first = newValue;
}
public void setSecond(T newValue)
{
second = newValue;
}
}
컴 파 일 러 는 형식 을 지우 고 아래 의 일반 클래스 로 변경 합 니 다.
public class Pair
{
private Object second;
private Object first;
public Pair()
{
first = null;
second = null;
}
public Pair(Object first, Object second)
{
this.first = first;
this.second =second;
}
public Object getFirst()
{
return first;
}
public Object getSecond()
{
return second;
}
public void setFirst(Object newValue)
{
first = newValue;
}
public void setSecond(Object newValue)
{
second = newValue;
}
}
경계 가 있 는 일반적인 클래스 에 대해 다음 코드 와 같은 여러 경계 가 있 으 면 자바 컴 파일 러 는 첫 번 째 경계 로 자동 으로 지 워 집 니 다.
public class Interval<T extends Comparable & Serializable> implements Serializable
{
private T lower;
private T upper;
...
public Interval(T first, T second)
{
if (first.compareTo(second) <= 0)
{
lower = first;
upper = second;
}
else
{
lower = second;
upper = first;
}
}
}
형식 지우 기 를 한 후에 위의 코드 는 첫 번 째 경계 Comparable 로 지 워 집 니 다.실제 자바 가상 컴퓨터 에서 코드 는 이 모양 입 니 다.
public class Interval implements Serializable
{
private Comparable lower;
private Comparable upper;
...
public Interval(Comparable first, Comparable second)
{
...
}
}
위의 코드 가 경계 순 서 를 바 꾸 면:
<T extends Serializable & Comparable>
그러면 컴 파일 러 는 Serializable 로 지 워 지고 컴 파일 러 는 필요 한 곳 에 강제 형식 변환 문 구 를 자동 으로 추가 하여 Serializable 을 Comparable 로 변환 합 니 다.
public class Interval implements Serializable
{
private Serializable lower;
private Serializable upper;
...
public Interval(Serializable first, Serializable second)
{
if (((Comparable)first).compareTo((Comparable)second) <= 0)
{
lower = first;
upper = second;
}
else
{
lower = second;
upper = first;
}
...
}
}
마찬가지 로 일반적인 방법 에 대해 서도 지 워 야 합 니 다.다음 과 같은 코드 입 니 다.
public static <T extends Comparable> T min(T[] a)
컴 파 일 러 에 의 해 지 워 지 는 것 은:
public static Comparable min(Comparable[] a)
주의:
하나의 방법의 반환 유형 이 범 형 일 때 지우 기 메커니즘 으로 인해 실제 적 으로 Object 나 경계 유형 으로 돌아 가면 컴 파일 러 는 자동 으로 유형 변환 문 구 를 추가 하여 지 워 진 대상 을 정상 적 인 대상 유형 으로 변환 합 니 다.
다음 코드 와 같이:
Pair<Employee> buddies = ...
Employee buddy = buddies.getFirst();
실제로 형식 이 지 워 지면 buddies.getFirst()는 Employee 형식의 인 스 턴 스 가 아 닌 Obecject 형식 으로 되 돌아 가 고 컴 파일 러 는 자동 으로 형식 장 치 를 추가 하여 Object 를 Employee 로 변환 합 니 다.
요약:
일반적인 방법 을 호출 할 때 컴 파일 러 는 하나의 호출 문 구 를 두 단계 로 나 누 어 집행 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.