변성은 Java 프로그래밍 언어에서 제네릭 타입들이 서로 어떻게 관련되어 있는지를 설명하는 용어다.
변성은 크게 공변성(Covariance), 반공변성(Contravariance), 그리고 무변성(Invariance)의 세 가지 유형이 있다.
1 공변성 (Covariance)
공변성은 하위 타입의 관계를 유지한다.
즉, Sub가 Super의 하위 타입일 때, Generic 또한 Generic의 하위 타입으로 간주한다.
Java에서는 extends 키워드를 사용하여 공변성을 표현한다.
List<? extends Number> numbers = new ArrayList<Integer>();
2 반공변성 (Contravariance)
반공변성은 상위 타입의 관계를 유지한다.
즉, Sub가 Super의 하위 타입일 때, Generic가 Generic의 하위 타입으로 간주된다.
Java에서는 super 키워드를 사용하여 반공변성을 표현한다.
List<? super Integer> numbers = new ArrayList<Number>();
3 무변성 (Invariance)
무변성은 타입 관계를 유지하지 않는다.
즉, Sub가 Super의 하위 타입일지라도 Generic와 Generic 사이에는 어떤 상속 관계도 없다.
List<Integer> integerList = new ArrayList<Integer>();
List<Number> numberList = integerList; // 컴파일 에러