자바 의 일반적인 사용 방법 에 대한 간단 한 소개
'범 형'은 말 그대로'범 지 의 유형'이다.우 리 는 일반적인 개념 을 제 공 했 지만 구체 적 으로 실 행 될 때 구체 적 인 규칙 으로 제약 할 수 있다.예 를 들 어 우리 가 사용 하 는 매우 많은 Array List 는 일반적인 유형 이다.Array List 는 집합 으로 각종 요 소 를 저장 할 수 있다.예 를 들 어 Integer,String,사용자 정의 의 각종 유형 등 이다.그러나 우리 가 사용 할 때 구체 적 인 규칙 을 통 해 제약 을 받는다.만약 우리 가 집합 에 Integer 형식의 요소 만 저장 하 는 것 을 제약 할 수 있다 면,예 를 들 어 List
2.범 형 을 사용 하면 무슨 좋 은 점 이 있 습 니까?
집합 으로 예 를 들 어 범 형 을 사용 하 는 장점 은 우리 가 요소 유형 이 다르다 고 해서 서로 다른 유형의 집합 을 정의 할 필요 가 없다 는 것 이다.예 를 들 어 정형 집합 류,부동 소수점 집합 류,문자열 집합 류 등 이다.우 리 는 하나의 집합 을 정의 하여 정형,부동 소수점 형,문자열 형 데 이 터 를 저장 할 수 있다.이것 은 가장 중요 한 것 이 아니다.우 리 는 바 텀 저장 소 를 Object 로 설정 하면 되 기 때문에 추 가 된 데 이 터 는 모두 Object 로 바 꿀 수 있 습 니 다.더 중요 한 것 은 우리 가 규칙 을 통 해 자신의 생각 에 따라 저 장 된 데이터 형식 을 제어 할 수 있다 는 것 이다.
우 리 는 Array List 를 예 로 들 면,만약 우리 가 이 달 까지 의 날 짜 를 Array List 에 넣 으 려 고 한다 면,만약 우리 가 일반적인 형식 을 사용 하지 않 는 다 면,이때 우 리 는 Array List 를 정의 합 니 다.
List monthDays = new ArrayList();
우 리 는 그 중 에 1 일부 터 4 일 까지 날 짜 를 넣 었 다.
public static List addMonthDays(){
List monthDays = new ArrayList();
monthDays.add(LocalDate.now().withDayOfMonth(1));
monthDays.add(LocalDate.now().withDayOfMonth(2));
monthDays.add(LocalDate.now().withDayOfMonth(3));
monthDays.add(new Date());
return monthDays;
}
이렇게 하면 문제 가 있 습 니까?여러분 도 알 아 보 셨 습 니 다.물론 있 습 니 다.모두 날 짜 를 표시 할 수 있 지만 Date,LocalDate 를 사 용 했 습 니 다.우 리 는 호출 방법 으로 직접 인쇄 했 습 니 다.바로 이 겁 니 다.
public static void main(String[] args) {
List monthDays = addMonthDays();
for(Object day : monthDays){
System.out.println(day);
}
}
2019-08-012019-08-02
2019-08-03
Sun Aug 04 10:27:10 CST 2019
우 리 는 분명히 이런 결 과 를 원 하지 않 을 것 이다.우리 가 원 하 는 것 은?
2019-08-01
2019-08-02
2019-08-03
2019-08-04
만약 에 저 장 된 요소 유형 이 이 두 가지(우리 가 알 고 있다 면)라면 이 럴 때 우 리 는 수 동 으로 판단 합 시다.
public static void main(String[] args) {
List monthDays = addMonthDays();
for(Object day : monthDays){
if (day instanceof Date){
Date date = (Date) day;
System.out.println(LocalDate.of(date.getYear(), date.getMonth(), date.getDay()));
}else {
System.out.println(day);
}
}
}
이때 우 리 는 상술 한 목적 을 달성 할 수 있 지만,여러분 도 알다 시 피,이런 서법 문 제 는 매우 크다.
public static List<LocalDate> addFormatMonthDays(){
List<LocalDate> monthDays = new ArrayList<>();
monthDays.add(LocalDate.now().withDayOfMonth(1));
monthDays.add(LocalDate.now().withDayOfMonth(2));
monthDays.add(LocalDate.now().withDayOfMonth(3));
monthDays.add(new Date());//
return monthDays;
}
코드 의 가 독성 을 높 였 을 뿐만 아니 라 우리 가 저장 한 것 이 LocalDate 유형 임 을 한눈 에 알 수 있다.이 동시에 컴 파일 러 도 이 정 보 를 잘 이용 할 수 있 고 컴 파일 기간 에 유형 검 사 를 할 수 있 으 며 안전성 을 확보 할 수 있 으 며 get 일 때 강제 유형 전환 을 하지 않 아 도 된다.범 형 류
클래스 를 더 많은 상황 에 적응 시 키 고 더 좋 은 확장 성 을 가지 기 위해 우 리 는 이 를 일반적인 클래스 로 설정 할 수 있 습 니 다.즉,하나 이상 의 유형 변 수 를 가 진 클래스 입 니 다.쓰 는 방법 은 다음 과 같 습 니 다.
public class ClassName< , 、 , > {
private property;
}
일반적인 식별 자 에 대해 일반적으로 약 속 된 표기 법 이 있 습 니 다.집합 을 나타 내 는 요소 유형 이 라면 보통 알파벳 E 를 사용 합 니 다.예 를 들 어 우리 가 자주 사용 하 는 Array List,Public class Array List
//
public class Garage<E> {
//
public void add(E car){
//...
}
}
우 리 는 또한 문자 K 와 V 로 키워드 와 값 의 유형 을 표시 할 수 있 습 니 다.예 를 들 어 우리 가 자주 사용 하 는 HashMap,Public class HashMap
//
//K,V: , ; , ; , ; ,
public class Mapping<K, V> {
private K key;
private V value;
}
우 리 는 또 하나의 문자 T 로 유형 을 표시 한다.
public class Person<T> {
private T t;
public Person(T t){
this.t = t;
}
public void run(){
System.out.println(t);
}
}
범 형 류 를 어떻게 사용 하 는 지,유형 을 어떻게 예화 하 는 지,우 리 는 들 어 오 는 실제 인삼 유형 과 범 형 매개 변수 유형 이 같 으 면 됩 니 다.
//
Person<String> s1 = new Person<String>(" ");
//jdk7.0
Person<String> s2 = new Person<>(" ");
s2.run();
// , , ,
Person t = new Person(111);
t.run();
// ,
Person<int> s = new Person<>(1);
범용 인터페이스범 형 인터페이스 와 범 형 류 의 정 의 는 기본적으로 일치 하 며 정 의 는 다음 과 같다.
public interface Person<T> {
public T parent();
public String eat();
}
우리 가 이 인 터 페 이 스 를 실현 하려 는 종 류 를 정 의 했 을 때 이런 유형의 범 형 유형 은 반드시 인터페이스 류 의 범 형 유형 과 일치 해 야 한다.실 삼 을 전달 하지 않 은 상황 에서 범 형 유형 T 를 계속 사용 하고 실 삼 을 전달 한 상황 에서 범 형 유형 은 반드시 실 삼 유형 을 사용 해 야 한다.
public class Teacher<T> implements Person<T> {
@Override
public T parent() {
return null;
}
@Override
public String eat() {
return null;
}
}
//Teacher , Person
public class Teacher implements Person<Integer> {
// Integer,
@Override
public Integer parent() {
return null;
}
@Override
public String eat() {
return null;
}
}
범 형 방법범 형 방법 은 일반 류 와 범 형 류 에서 정의 할 수 있다.예 를 들 어 범 형 류 는 더욱 자주 사용 된다.보통 범 형 방법 으로 해결 할 수 있 는 문 제 는 범 형 류 를 사용 하지 않 고 범 형 류 를 우선 사용 할 수 있다.유형 변 수 는 수정자 뒤에 놓 인 다.예 를 들 어 Public static,Public final 등 이다.
public class Teacher {
public static <T> T println(T t){
System.out.println(t);
return t;
}
}
호출 은 매우 간단 하고 일반적인 방법 으로 호출 하 는 것 은 같 으 며 더욱 편리 한 것 은 유형 이 일반적인 방법 으로 한정 되 지 않 았 다 는 것 이다.
String s = Teancher.println("str");
또한 설명 이 필요 한 것 은 범 형 류 에서 의 범 형 방법 을 정의 하 는 범 형 변수 간 에는 관계 가 없다 는 것 이다.예 를 들 어 이러한 코드 는
public class Teacher<T> {
T teacher;
public Teacher(T t){
this.teacher = t;
}
public <T> T println(T t){
System.out.println(t);
return t;
}
}
Teacher<String> teacher = new Teacher<>(" ");
Integer in = teacher.println(123456);
클래스 범 형 유형 은 String 이 고 방법의 범 형 유형 은 Integer 입 니 다.모두 T 로 표시 되 지만.동시에 범 형 방법 에 대해 설명해 야 할 것 은:
수정자 Public xx 와 방법 명 사이 에서 매우 중요 합 니 다.
6.유형 변수 한정
범 형 류 든 범 형 방법 이 든 현재 로 서 는 유형 제한 이 없다.우리 가 어떤 유형의 변 수 를 전달 하 든 들 어가 도 된다.왜냐하면 우 리 는 처리 논리 에서 이 유형 특유 의 것(구성원 변수,방법 등)을 사용 하지 않 았 기 때문이다.만약 우리 가 전달 하고 자 하 는 매개 변수 유형 이 하나의 큰 클래스(아버지 클래스)아래 의 작은 클래스(하위 클래스)에 불과 하 다 면 어떻게 합 니까?
public class ArrayFlag {
public static <T> T getMax(T[] array){
if(array == null || array.length == 0){
return null;
}
T maxValue = array[0];
for(int i = 0; i < array.length; i++){
if(array[i].compareTo(maxValue) > 0){
maxValue = array[i];
}
}
return maxValue;
}
}
getMax 방법 에서 compare To 방법 을 사용 하여 비교 하 는 것 을 보 셨 습 니 다.그러나 우리 가 들 어 오 는 유형 T 에 compare To 방법 이 없다 면 잘못 보고 해 야 하 는 것 이 아니 겠 습 니까?그래서 우 리 는 한정 을 해 야 합 니 다.Comparable 인터페이스 인 필연적으로 compare To 방법 을 갖 추 는 것 을 한정 하면 이렇게 됩 니 다.
public class ArrayFlag {
public static <T extends Comparable> T getMax(T[] array){
if(array == null || array.length == 0){
return null;
}
T maxValue = array[0];
for(int i = 0; i < array.length; i++){
if(array[i].compareTo(maxValue) > 0){
maxValue = array[i];
}
}
return maxValue;
}
}
이 동시에 설명 해 야 할 것 은 여기 서 extends 키 워드 를 사용 합 니 다.extends 는 여기 서 Comparable 인터페이스 와 그 하위 유형 을 연결 하 는 것 을 의미 합 니 다.'바 인 딩,한정'이라는 뜻 입 니 다.'계승'이 아니 라 뒤에 도 인터페이스 나 클래스 가 있 을 수 있 습 니 다.여러 가지 제한 이 있 으 면&구분 을 사용 할 수 있 습 니 다.예 를 들 어:
public static <T extends Comparable & Serializable> T getMax(T[] array)
범용 어댑터예 를 들 어 책 류 와 소설 류 를 정의 했다.
//
public class Book {}
//
public class Novel extends Book {}
우 리 는 책 과 소설 을 담 는 책장 류 를 다시 정의 했다.
//
public class Bookcase<T> {
T b;
public Bookcase(T t){
this.b = t;
}
public void set(T t) {
b=t;
}
public T get() {
System.out.println(b.getClass());
return b;
}
}
다음은 책장 으로 소설 을 담 겠 습 니 다.
// , , Incompatible types, Required Book Found Novel
Bookcase<Book> bc = new Bookcase<Novel>(new Novel());
그러나 jdk 7.0 이후 new Bookcase 는 일반적인 형식 을 제시 하지 않 아 도 되 고 생략 된 유형 은 변수의 유형 으로 추정 할 수 있 기 때문에 다음 과 같은 표기 법 이 있 으 면
Bookcase<Book> bc = new Bookcase<>(new Novel());
System.out.println(bc.getClass());
bc.get();
이 때 컴 파일 을 통과 할 수 있 습 니 다.우리 가 실행 한 결 과 는:
class generic.Bookcase
class generic.Novel
물론 우 리 는 마스크 를 통 해 이 문 제 를 해결 할 수 있다.마스크 는 다음 과 같은 몇 가 지 를 포함한다.상계 어댑터,하계 어댑터,무한 정 어댑터
7.1 상계 어댑터
상계 어댑터 의 정의 방식 은 다음 과 같다.extends 키 워드 를 사용 하면 이 책장 에 소설 류 서적(예 를 들 어 도시 소설,사랑 소설,판 타지 소설 등)만 놓 을 수 있 지만 아버지 류 서적,다른 류,예 를 들 어 사서,직장 류 서적,재 경 류 서적 등 을 놓 을 수 없고 사용 할 때 한정 할 수 없다.예 를 들 어:
Bookcase<? extends Book> bc = new Bookcase<Novel>(new Novel());
이런 정의 방식 은 컴 파일 오류 가 없 을 것 이다.또한 상계 어댑터 의 특징 에 대해 서 는 상한 선 에 제한 이 있 으 며,자바 다 중 상 향 조형 원칙 에 따라 데 이 터 를 자주 삽입 하 는 것 은 적합 하지 않 으 며,데 이 터 를 자주 읽 는 장면 에 적합 합 니 다.7.2 하계 어댑터
하계 어댑터 의 정의 방식 은 다음 과 같다.슈퍼 키 워드 를 사용 하면 책장 에 하한 선 을 두 었 다 는 뜻 이다.우 리 는 Book 서적 과 Novel 서적 만 놓 을 수 있 을 뿐 세분 화 된 도시 소설,사랑 소설 류 서적 은 넣 을 수 없다.
Bookcase<? super Novel> bc = new Bookcase<Novel>(new Novel());
또한 하계 어댑터 의 특징 은 상계 어댑터 와 정반 대로 데 이 터 를 자주 읽 기 에 적합 하지 않 고 데 이 터 를 자주 삽입 하 는 장면 에 적합 하 다.7.3 무한 정 어댑터
무한 정 어댑터 는 모든 대상 을 사용 할 수 있 음 을 의미 하기 때문에 원생 유형 을 사용 하 는 것 과 유사 하 다.그러나 이 는 역할 을 한다.원생 유형 은 모든 유형 을 가 질 수 있 고 무한 정 마스크 로 장 식 된 용 기 는 특정한 구체 적 인 유형 을 가지 고 있다.
예 를 들 어:
List<?> list = new ArrayList<>();
//
list.add(new Object());
//
List<Object> list = new ArrayList<>();
list.add(new Object());
다시 한 번범 형 은 자바 에서 자주 사용 된다 고 할 수 있 습 니 다.우리 가 앞에서 언급 한 집합 류,예 를 들 어 Array List,HashSet,그리고 Map 은 모두 범 형 에 사용 되 었 습 니 다.범 형 도 우리 가 구성 요 소 를 포장 하 는 데 자주 사용 되 는 것 입 니 다.본 고 는 주로 범 형 기본 개념,범 형 을 사용 하 는 장점,범 형 류,인터페이스,방법,어댑터 의 간단 한 소개 와 사용 방법 을 소개 합 니 다.마지막 으로 범 형 일반 과 반사 집합 을 통 해 사용 할 수 있 습 니 다.범 형 을 통 해 유형의 유연 한 전달 을 할 수 있 습 니 다.반 사 를 통 해 실체 와 유형의 데이터 정 보 를 얻 을 수 있 고 일부 구조,구성 요소 의 포장 을 실현 할 수 있 습 니 다.잘못된 점 이 있 으 면 비판 하고 지적 하 며 공동으로 발전 하 시기 바 랍 니 다.감사합니다!
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.