자바 제네릭을 보면서, 공변과 반공변의 이야기가 나왔다. 결론적으로 내가 이해 하기론
공변은 <? extends 상위타입>을 하면 List를 받을시에 하위타입까지 읽을수 있게 처리를 할수 있고
반공변은 <? super 하위타입>을 하면 본인 타입 포합 상위타입을 참조할수 있다고 이해하였다.
먼저 해당 상속간의 클래스 코드들입니다.
class User {
public void good() {
System.out.println("User Good");
}
}
class A extends User {
@Override
public void good() {
System.out.println("1111");
}
}
class B extends User {
@Override
public void good() {
System.out.println("2222");
}
}
공변은
public void process(List<? extends User> users) {
for (User user : users) {
user.good();
}
}
public void test() {
List<User> users = new ArrayList<>();
users.add(new A());
users.add(new B());
users.add(new User());
process(users);
이렇게 하위 객체까지 전부 호환가능하게 처리 하는 방법
반공변은
public void processA(List<? super A> users) {
// users.add(new A());
}
List<User> users2 = new ArrayList<>();
users2.add(new User());
processA(users2);
List<A> users3 = new ArrayList<>();
이렇게 처리가 된다.
'Java' 카테고리의 다른 글
| 링크드 리스트 자료구조 (1) | 2024.11.08 |
|---|---|
| 자바 리플렉션(reflection)에 대해서 찾아보기 (2) | 2024.11.08 |
| JavaBean과 POJO (0) | 2024.11.04 |
| ArrayList의 자동 크기 증가 (0) | 2024.10.31 |
| 부동소수점에서 엡실론 (1) | 2024.10.31 |