반응형
- 공변성, 무공변성, 반공변성이란
- 공변성(covariant) : T
가 T의 서브타입이면, C<T
>는 C의 서브 타입이다. - 반공변성(contravariant) : T
가 T의 서브타입이면, C<T>는 C<T
>의 서브 타입이다. - 무변성(invariant) : C와 C<T`>는 아무 관계가 없다.
- 공변성(서브타입 와일드 카드) : 자기 자신과 자식 객체만, 타입 T를 확장한 타입에 대해서 허용
// 공변성 : 자기 자신과 자식 객체만 허용함 public static List<Character> firstChars(List<? extends CharSequence> list ) { return list.stream().map(cs -> cs.charAt(0)).collect(Collectors.toList()); } // 반환 타입은 저장할 수 있지만, 파라미터에는 사용할 수 없다. List<? extends String> list = new ArrayList<String>(); String first = list.get(0); // 반환 타입을 String 변수에 저장할 수 있다. list.add("abc"); // 컴파일 에러, String 변수를 인자로 넘길 수 없다. / 뭔지도 모르는 타입 변수를 만들 수 없다.
- 서브 타입 와일드 카드는 메서드의 반환 타입에서는 사용할 수 있지만, 메서드의 파라미터에는 사용할 수 없다.
- ? extends String 형태
- 무공변성(불변성) : 자기 자신 타입 T만 허용
static class Test { public void printCollectionGen(Collection<Object>collection) { for (Object e : collection) { System.out.println(e); } } public Test() { } } public static void main(String[] args) { Test t = new Test(); List<String> s = new ArrayList<>(); s.add("Test"); t.printCollectionGen(s); // 컴파일 오류 }
- 반공변성(슈퍼타입 와일드 카드) : 자기자신과 부모 객체만, 타입 T의 상위(부모) 타입에 대해서 허용
public static void main(String[] args) { // 반공변성 // 반환 타입에는 사용할 수 없다. List<? super String> list2 = new ArrayList<String>(); String first2 = list2.get(0); // 컴파일 에러, String 반환 타입을 사용할 수 없다. / String을 Object를 할당 할 수 없는 것과 같다. list2.add("Test"); // String 변수를 인자로 넘길 수 있다. }
- 슈퍼 타입 와일드 카드는 메서드의 파라미터 타입을 설정에 사용하지만, 반환 타입으로는 사용할 수 없다.
- 반공변성은 주로 타입 파라미터로 결정되는 함수형 인터페이스에서 사용 된다.
- ? super String 형태
- 공변성(covariant) : T
반응형
'개발(합니다) > Java&Spring' 카테고리의 다른 글
[java-기초-01] 자바란? (0) | 2020.12.30 |
---|---|
Java 검사 예외(Checked) 와 비검사 예외(UnChecked) (0) | 2020.12.17 |
Spring 유효성 검사(interface) (0) | 2019.01.24 |
Spring Security에서 사용자 정보 가져오기 (0) | 2019.01.23 |
Spring 유효성 검사(hibernate) (0) | 2019.01.23 |