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>();
 
    }
}