java/코드 리뷰
15. demo1.person - (2) PersonDemo (와일드카드 제네릭 타입제한)
Astaroth아스
2020. 4. 24. 14:55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package demo1.person;
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
|
1
2
3
4
5
6
|
package demo1.person;
public class Student extends Person {
}
|
1
2
3
4
5
6
|
package demo1.person;
public class PostGraduateStudent extends Student {
}
|
1
2
3
4
5
6
|
package demo1.person;
public class CollegeStudent extends Student {
}
|
1
2
3
4
5
6
|
package demo1.person;
public class Worker extends Person {
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package demo1.person;
import java.util.ArrayList;
public class PersonDemo {
// 학생, 대학생, 대학원생이 파라미터 타입으로 지정된 Course객체만 전달받음
public static void addStudentCourse(Course<? extends Student> c) {
}
// 직장인, 일반사람이 파라미터 타입으로 지정된 Course객체만 전달받음
public static void addWorkAndPersonCourse(Course<? super Worker> c) {
}
public static void main(String[] args) {
Course<Student> c1 = new Course<Student>("전공과정");
Course<PostGraduateStudent> c2 = new Course<PostGraduateStudent>("석사과정");
Course<Worker> c3 = new Course<Worker>("직장인과정");
Course<Person> c4 = new Course<Person>("일반인과정");
addStudentCourse(c1);
addStudentCourse(c2);
// addStudentCourse(c3); // c3는 파라미터 타입이 Worker로 지정되어 있어서 전달 불가
// addStudentCourse(c4); // c4는 파라미터 타입이 Person으로 지정되어 있어서 전달 불가
// addWorkAndPersonCourse(c1); // c1은 파라미터 타입이 Student로 지정되어 있어서 전달불가
// addWorkAndPersonCourse(c2); // c2는 파라미터 타입이 Student로 지정되어 있어서 전달불가
addWorkAndPersonCourse(c3);
addWorkAndPersonCourse(c4);
/*
와일드카드 제네릭 타입제한
<? extends T> 상위제한 T와 T의 자손들
<? super T> 하위제한 T와 T의 조상들
<?> 제한없음 <? extends Object>와 동일
단, 와일드카드를 사용해서 타입제한을 하기 위해선
해당 클래스가 제네릭 타입 클래스여야 가능
*/
// <? extends Student>는 Student와 Student의 자손으로 타입을 제한함
// ArrayList<? extends Student> list1 = new ArrayList<Student>();
// list1.add(new Person());
// list1.add(new Student());
// list1.add(new CollegeStudent());
// list1.add(new PostGraduateStudent());
//
//
// // <? super Worker>은 Worker과 Worker의 부모들로 타입을 제한함
// ArrayList<? super Worker> list2 = new ArrayList<Person>();
}
}
|