와일드카드


<aside> 🕕

설명


예제


<aside> 🎍

package generic.ex5;

import generic.animal.Animal;

public class WildcardEx {

    static <T> void printGenericV1(Box<T> box) {
        System.out.println("T = " + box.get());
    }

    //와일드 카드
    static void printWildcardV1(Box<?> box) {
        System.out.println("? = " + box.get());
    }

    static <T extends Animal> void printGenericV2(Box<T> box) {
        T t = box.get();
        System.out.println("이름 = " + t.getName());
    }

    //와일드 카드
    static void printWildcardV2(Box<? extends Animal> box) {
        Animal animal = box.get();
        System.out.println("이름 = " + animal.getName());
    }

    static <T extends Animal> T printAndReturnGeneric(Box<T> box) {
        T t = box.get();
        System.out.println("이름 = " + t.getName());
        return t;
    }

    //와일드 카드
    static Animal printAndReturnWildcard(Box<? extends Animal> box) {
        Animal t = box.get();
        System.out.println("이름 = " + t.getName());
        return t;
    }
}
--------------------------------------
package generic.ex5;

import generic.animal.Animal;
import generic.animal.Cat;
import generic.animal.Dog;

public class WildcarMain1 {

    public static void main(String[] args) {
        Box<Object> objBox = new Box<>();
        Box<Dog> dogBox = new Box<>();
        Box<Cat> catBox = new Box<>();
        dogBox.set(new Dog("멍멍이", 100));

        WildcardEx.printGenericV1(dogBox);
        //와일드 카드
        WildcardEx.printWildcardV1(dogBox);

        WildcardEx.printGenericV2(dogBox);
        //와일드 카드
        WildcardEx.printWildcardV2(dogBox);

        Dog dog = WildcardEx.printAndReturnGeneric(dogBox);
        //와일드 카드
        Animal animal = WildcardEx.printAndReturnWildcard(dogBox);
    }
}

구조 차이



    
    제네릭 타입
    static <T "상속"> T "메서드명"(제네릭명<T> 변수 명) {
    }
    
    와일드 카드
    static "반환 타입" "메서드명"(제네릭명<? "상속"> 변수 명) {
    }

</aside>

와일드카드 vs 제네릭 메서드


<aside> 🔇

설명