와일드카드 타입 파라미터
- 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 범위에 있는 모든 타입으로 대체할 수 있는 타입 파라미터. ?로 표시
출처, 이것이 자바다
출처, 이것이 자바다
package ch13.sec05;
//일반인
public class Person {
}
//직장인
class Worker extends Person {
}
//학생
class Student extends Person {
}
//고등학생
class HighStudent extends Student {
}
//중학생
class MiddleStudent extends Student {
}
package ch13.sec05;
//수강생, 응모자
public class Applicant<T> {
public T kind;
public Applicant(T kind) {
this.kind = kind;
}
}
package ch13.sec05;
//학원의 과정
public class Course {
//모든 사람이면 등록 가능.
public static void registerCourse1(Applicant<?> applicant) {
System.out.println(applicant.kind.getClass().getSimpleName() +
"이(가) course1을 등록함");
}
//학생만 등록 가능
public static void registerCourse2(Applicant<? extends Student> applicant) {
System.out.println(applicant.kind.getClass().getSimpleName() +
"이(가) course2를 등록함");
}
//직장인 및 일반인만 등록 가능
public static void registerCourse3(Applicant<? super Worker> applicant) {
System.out.println(applicant.kind.getClass().getSimpleName() +
"이(가) course3을 등록함");
}
}
package ch13.sec05;
//수강 신청 프로그램.
public class GenericExample {
public static void main(String[] args) {
//모든 사람이 신청 가능 -> registerCourse1(Applicant<?> applicant)을 참조함
Course.registerCourse1(new Applicant<Person>(new Person())); //일반인
Course.registerCourse1(new Applicant<Worker>(new Worker())); //직장인
Course.registerCourse1(new Applicant<Student>(new Student())); //학생
Course.registerCourse1(new Applicant<HighStudent>(new HighStudent())); //고등학생
Course.registerCourse1(new Applicant<MiddleStudent>(new MiddleStudent())); //중학생
System.out.println();
//학생만 신청 가능 -> registerCourse2(Applicant<? extends Student> applicant)을 참조함
// Course.registerCourse2(new Applicant<Person>(new Person()));
// Course.registerCourse2(new Applicant<Worker>(new Worker()));
Course.registerCourse2(new Applicant<Student>(new Student()));
Course.registerCourse2(new Applicant<HighStudent>(new HighStudent()));
Course.registerCourse2(new Applicant<MiddleStudent>(new MiddleStudent()));
System.out.println();
//직장인 및 일반인만 신청 가능 -> registerCourse3(Applicant<? super Worker> applicant)을 참조함
Course.registerCourse3(new Applicant<Person>(new Person()));
Course.registerCourse3(new Applicant<Worker>(new Worker()));
// Course.registerCourse3(new Applicant<Student>(new Student()));
// Course.registerCourse3(new Applicant<HighStudent>(new HighStudent()));
// Course.registerCourse3(new Applicant<MiddleStudent>(new MiddleStudent()));
}
}
'라이브러리 활용 - 제네릭' 카테고리의 다른 글
제한된 타입 파라미터 (0) | 2023.02.02 |
---|---|
제네릭 메소드 (0) | 2023.02.02 |
제네릭 타입 (0) | 2023.02.02 |
제네릭이란? (0) | 2023.02.02 |