가변성(Variance) : 특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격
C<T>
가 C<X>
-> C<Y>
로 가능하다C<T’>
는 C<T>
의 서브타입이다.C<T>
가 C<Y>
-> C<X>
로 가능하다C<T>
는 C<T’>
의 서브타입이다.C<T’>
는 아무 관계가 없다.불변성(Invariant) : X -> Y가 가능하더라도 C<X>
는 C<X>
로만 사용할 수 있다.
공변성 : 자기 자신과 자식 객체로 타입 변환을 허용해주는 것입니다.(자바의 array 가 대표적인 공변의 예시)
Object[] before = new Long[1];
불공변 : List과 List가 있을 때 두 개의 타입은 전혀 관련이 없다는 뜻입니다.
기본적으로 제네릭은 불변이다.
public class Test {
public static void test(List<Object> list) {
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("test");
test(list); // 컴파일 에러
}
}
https://velog.io/@lsb156/covariance-contravariance
https://sungjk.github.io/2021/02/20/variance.html
https://devlog-wjdrbs96.tistory.com/263
Java 의 Generics(1) - 서브클래싱(SubClassing)과 서브타이핑(SubTyping)
Java 의 Generics(3) -generic 타입과 네이밍