Study
지네릭 - 와일드 카드
스파이더웹
2022. 8. 9. 00:23
728x90
반응형
와일드 카드란 ? 지네릭 타입에 다형성을 적용하는 방법
와일드 카드는 기호 "?" 로 표현이 되는데, 'extends' 와 'super' 로 상한과 하한을 제한할 수 있다
<? extends T> 와일드 카드의 상한 제한 T와 그 자손들만 가능 <? super T> 와일드 카드의 하한 제한 T와 그 조상들만 가능 <?> 제한 없음. 모든 타입이 가능 <? extends Object> 와 동일 |
728x90
Study 아래 두개의 차이점 ?
public static void printAll(ArrayList<? extends Product> list, ArrayList<? extends Product> list2) {...}
public static <T extends Product> void PrintAll(ArrayList<T> list, ArrayList<T> list2) {...}
아래 코드를 살펴보자
public class GenTest {
public static void main(String[] args) {
ArrayList<Tv> tv = new ArrayList<>();
tv.add(new Tv("삼성"));
tv.add(new Tv("LG"));
ArrayList<Audio> audio = new ArrayList<>();
audio.add(new Audio("오디오"));
printAll(tv,audio);
printAll2(tv,audio);//컴파일 오류
}
public static void printAll(ArrayList<? extends Product> list, ArrayList<? extends Product> list2) {
for (Product product : list) {
System.out.println("list1 : "+product);
}
for (Product product : list2) {
System.out.println("list2 : " + product );
}
}
public static <T extends Product> void printAll2(ArrayList<T> list3, ArrayList<T> list4) {
for (Product product : list3) {
System.out.println("list3 : "+product);
}
for (Product product : list4) {
System.out.println("list4 : " + product );
}
}
}
class Product {
}
class Tv extends Product {
String tv;
public Tv(String tv) {
this.tv = tv;
}
public String getTv() {
return tv;
}
}
class Audio extends Product{
String audio;
public Audio(String audio) {
this.audio = audio;
}
public String getAudio() {
return audio;
}
}
위의 예제를 간단하게 코드로 구현해보았다.
코드로 보니 쉽게 알 수있는데, 두가지의 가장 큰 차이점은 "?" 와일드카드의경우 Product 자손 클래스면 매개변수로 넘겨줄 수 있다
그러나 "T" 타입의 경우 Product 자손 중에 T를 특정한다는 것이므로 두개의 매개변수로 동일한 특정타입 하나로 매개변수로 넘겨줘야한다. 즉, 예제에서는 Tv면 Tv, Audio면 Audio 하나로 통일을 해줘야 한다
728x90
반응형