이번 포스팅은 제너릭의 와일드 카드 문법에 대해서 알아보자.
우선 제너릭 클래스를 하나 만들었다.
public class TestWildcard<T> {
T wildcard;
public void setWildcard(T wildcard) {
this.wildcard = wildcard;
}
public T getWildcard() {
return wildcard;
}
}
public class WildcardRunner {
public void callTestWildcard() {
// 1
TestWildcard<Integer> wildcard = new TestWildcard<>();
// 2
wildcard.setWildcard(123);
//3
wildIntegerMethod(wildcard);
}
//4
public void wildIntegerMethod(TestWildcard<Integer> param) {
Integer value = param.getWildcard();
}
}
여기서 wildIntegerMethod의 파라미터로 TestWildcard<
Integer
>가 아닌 TestWildcard<String
>을 사용해야 한다면 어떻게 해야할까??
?
) 사용이런 경우 사용되는 것이 와일드 카드이다. 위 wildIntegerMethod에서 파라미터로 TestWildcard<?>
를 사용하면 된다.
?
로 명시한 것을 와일드 카드
라고 한다.public void wildIntegerMethod(TestWildcard<?> param){
Object value=param.getWildcard();
if(value instanceof String){
System.out.println(value);
}
}
?
로 설정을 했기 때문에 타입을 알 수 없고, 특정 타입을 지정할 수 없다.public void callTestWildcard() {
//1
TestWildcard<?> wildcard = new TestWildcard<>();
wildcard.setWildcard(123);
wildIntegerMethod(wildcard);
}
extend
를 사용함으로써 객체의 타입을 제한할 수 있다.public class Fruit {
protected String name;
public Fruit(String name) {
this.name = name;
}
@Override
public String toString() {
return "Fruit{" +
"name='" + name + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
}
public class Apple extends Fruit{
public Apple(String name) {
super(name);
}
@Override
public String toString() {
return "apple";
}
}
public class FruitRunner {
//1
public void callBananaFruit() {
TestWildcard<Fruit> wildcard = new TestWildcard<>();
wildcard.setWildcard(new Fruit("banana"));
printFruit(wildcard);
}
//2
public void callApple() {
TestWildcard<Apple> wildcard = new TestWildcard<>();
wildcard.setWildcard(new Apple("apple"));
printFruit(wildcard);
}
//3
private void printFruit(TestWildcard<? extends Fruit> param) {
Fruit value = param.getWildcard();
System.out.println(value);
}
}
extend
를 사용해서 객체의 타입을 제한할 수 있다.extend
를 사용하면 객체의 타입을 제한할 수 있다.Reference