1 답변
-
? extends List<LatLng>
란List<LangLng>
를 상속한 어떤 타입 이란 의미를 갖습니다.예를 들어보면 아래와 같은 코드가 있습니다.
class LatLng {} class LatLng2 extends LatLng {} class LatLng3 extends LatLng {} void print(List<LatLng> l) {} List<LatLng> l1; List<LatLng2> l2; List<LatLng3> l3; print(l1); print(l2); print(l3);
이 코드를 컴파일 하게 되면
print(l2);
와print(l3);
에서 오류가 발생할 것입니다.LatLng2
와LatLng3
는LatLng
를 상속하고이어 캐스팅이 가능합니다. 하지만List<LatLng>
는List<LatLng2>
와List<LatLng3>
에 대해서 어떠한 상속 관계도 갖지 않는 타입니다.List
는 원소의 상속관계를 상관하지않기에List<LatLng>
,List<LatLng2>
,List<LatLng3>
는 서로 다른 타입이고void print(List<LatLng> l)
는List<LatLng>
에 대한 호출만 가능합니다.그렇다면 세가지 타입에 대한
print()
를 작성해야 하는데, 이는 중복된 작업이 있을 수 있고print()
는 단지LatLng
를 상속하던 안하던LatLng
에 대한 내용만 출력하고 싶을 수 있습니다.이를 위해서
print()
를 아래와 같이 제네릭을 적용할 수 있습니다.void print(List<? extends LatLng> l) {}
이렇게 변환하면
print(l1);
,print(l2);
,print(l3);
를 할 수 있는 함수를 작성할 수 있습니다.다시 본론으로 넘어와
List <? extends List <LatLng >>
는 어떤식으로 사용하는 것일 까요?void func(List <? extends List <LatLng >> l) { // .. } List<ArrayList<LatLng>> l1; List<LinkedList<LatLng>> l2; List<LinkedList<LatLng>> l3; func(l1); func(l2); func(l3);
위 코드를 보면
l1
,l2
,l3
는ArrayList
든LinkedList
든 결국 하고하자는 일은LatLng
을 차례대로 저장하는 것입니다. 다만 구현에 따라 두 형태의 리스트로 나뉘는 것일 뿐이지요. 위 코드에서List <? extends List <LatLng >>
로 해두었기에ArrayList
든LinkedList
든func()
을 호출 할 수 있습니다. 만약List <List <LatLng >>
으로 했다면l1
,l2
,l3
에 대한 호출 모드 오류가 발생합니다. 앞서 설명 드렸듯이List
에는 원소의 상속관계가 적용되지 않기 때문입니다.
댓글 입력