자바 범 형 초보 자 위,하계 어댑터 의 깊이 있 는 이해

범 형의 유래
왜 범 형 이 필요 해?
자바 의 데이터 형식 은 일반적으로 정의 할 때 확인 해 야 합 니 다.이러한 강제 적 인 장점 은 유형 안전 입 니 다.ClassCastException 의 데 이 터 를 jvm 에 제공 하지 않 고 데이터 가 안전 하면 실 행 된 class 가 안정 적 입 니 다.그러나 만약 에 제 가 이 매개 변 수 를 어떤 유형 으로 전달 해 야 할 지 모 르 겠 습 니 다.회사 의 수요 가 바 뀌 고 있 기 때문에 죽은 것 을 쓰 면 이 수 요 를 한 번 바 꿀 수 밖 에 없습니다.귀 찮 습 니 다.sun 회사 도 이 문 제 를 주목 하여 코드 의 유연성 을 떨 어 뜨 릴 수 있다 는 것 을 알 게 되 었 고 그들 은 범 형 을 연구 했다.
범 형 초식
범 형 이 무엇 인지 말 그대로 이해 할 수 있 는 범 범 형 이다.그 는 확실 하지 않다.자바 코드 를 컴 파일 할 때 범 형 을 사용 하 는 것 은 틀 리 지 않 고 운행 기간 에 잘못 보고 할 것 이다.이런 첫 번 째 는 불합리 하 다 고 말한다.왜 그 러 지?유연성 을 높이 기 위해 컴 파일 시기 에 조건 을 완화 하지만 범 형 은 반드시 운행 할 때 jvm 에 게 네가 나 에 게 준 데이터 가 도대체 어떤 유형 인지 알려 야 한다.그렇지 않 으 면 jvm 은 멍청 할 것 이다.그래서 범 형의 장점 은 바로 유형의 유연성 을 향상 시 키 는 것 이다.즉,자바 문법 을 바탕 으로 향상 시 키 는 것 이지 만 범 형 은 비교적 실 용적 이다.
팬 형 을 언제 사용 합 니까?
일반적인 응용 장면 은 바로 모델(데 이 터 를 저장 하 는 상자 로 이해 할 수 있 습 니 다)에 응용 되 는 것 입 니 다.저 는 이 상자 에 더 많은 부분 을 적용 하기 위해 저 는 저장 해 야 할 데 이 터 를 하나의 범 형 으로 표시 합 니 다.물론 다 중 값 을 전달 할 수 있 습 니 다.같은 유형의 대상 이 라면 일반적인 배열 을 사용 하 는 것 이 좋 습 니 다.집합 을 배 운 동료 들 은 모두 알 고 있 을 것 입 니 다.배 운 적 이 없 으 면 보충 수업 을 해 야 합 니 다.
일반적인 문법

public class A<T extends B>{
 T t;
}
일반적인 단점 이나 왜 상하 경계 가 필요 합 니까?
범 형 은 강하 지만 세계 의 어떤 것 도 동 부 는 완벽 하 다.그것 도 결함 이 있다.예 를 들 어 나 는 사 과 를 담 고 싶 은 상자 가 있 지만 바 나 나 를 담 고 싶 을 수도 있다.그러면 어 떡 하지?글 쎄,매개 변 수 를 하나 더 주면 되 잖 아.그 열 개 는?스 무 개 는?엠.우리 가 담 고 싶 은 것 은 모두 같은 부류 에 속 하고 이런 부류 의 하위 클래스 라면 담 을 수 있다.이 생각 은 sun 이 우 리 를 위해 생각해 주 었 다.그것 은 바로 상경 계 어댑터 를 사용 하 는 것 이다.문법 은 T 는 범 형 이 고 M 은 T 의 부류 이다.우 리 는 과일 류(Fruit)를 정의 합 니 다.담 으 면 용기 가 접시(Dish)입 니 다.이제 우 리 는 어떤 과일 도 담 을 수 있 습 니 다.괜 찮 죠?
상위 경계 자바 코드

public class Dish<T extends Fruit>{
 private T fruitChild;

 public Dish(T fruitChild){
 this.fruitChild = fruitChild;
 }

 public T getFruitChild(){
 return fruitChild;
 }
 
 public void setFruitChild(T f){
 this.fruitChild = f;
 }

 public static void main(String[] args){

 Dish dish = new Dish<apple>();
 Apple apple = new apple(); //apple must be Fruit child;
 dish.setFruitChild(apple);

 system.out.printf(dish.getFruitChild);
 }
}
하위 경계 자바 코드

public class Dish<T super Apple>{
 private T appleFather;

 public Dish(T appleFather){
 this.appleFather = appleFather;
 }

 public T getAppleFather(){
 return appleFather;
 }

 public void setAppleFather(T f){
 this.appleFather = f;
 }

 public static void main(String[] args){

 Dish dish = new Dish<Fruit>();
 Fruit fruit = new Fruit(); //fruit must be apple son;
 dish.setAppleFather(fruit);

 system.out.printf(dish.getAppleFather);
 }
}
상단 경계 어댑터 가 무엇 입 니까?
범 형 T 가 정 형 된 A 유형 에서 A 유형의 모든 하위 클래스 의 제한 도 메 인 에 있 을 때 이 제한 도 메 인 에 있 는 모든 유형 과 일치 할 수 있 습 니 다.이 는 경계 어댑터 라 고 합 니 다.
상단 경계 어댑터 이해

다음 경계 어댑터 가 무엇 입 니까?
범 형 T 가 정 형 된 A 형식 에서 A 유형의 모든 부모 클래스 의 제한 도 메 인 에 있 을 때 이 제한 도 메 인 에 있 는 모든 유형 과 일치 할 수 있 습 니 다.이 는 하 경계 어댑터 라 고 합 니 다.
아래 경계 어댑터 이해\#

상하 경계 어댑터 의 단점
상계안 으로 저장 할 수 없고 밖으로 만 가 져 갈 수 있 습 니 다.
해명 하 다.
컴 파일 러 는 T 의 하위 클래스 만 들 어 오 는 것 을 알 고 있 기 때 문 입 니 다.그러나 구체 적 으로 어떤 컴 파일 러 인지 모 르 기 때문에 그 는 자리 차지 문자 만 표 시 했 습 니 다.적당 합 니까?전 해 왔 을 때,그 는 이것 이 자리 표시 자 와 일치 할 수 있 을 지 몰라 서 set 할 수 없 었 다.
하계안 으로 저장 하 는 데 영향 을 주지 않 지만,밖으로 꺼 내 면 Object 대상 에 만 넣 을 수 있 습 니 다.
해명 하 다.
하 경계 가 제한 되 어 있 으 니까?그 는 T 자체 나 T 의 부류 일 뿐이다.생각해 보 자.나 는 T 를 원 하 는데,너 는 오히려 나 에 게 T 보다 작은 Object 를 주 었 다.그러면 우 리 는 정밀도 손실 로 원 하 는 데 이 터 를 얻 지 못 할 것 이다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기