Java

공변과 반공변에 대해

오개발 2024. 11. 5. 15:14

 

자바 제네릭을 보면서, 공변과 반공변의 이야기가 나왔다. 결론적으로 내가 이해 하기론

공변은 <? 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