제네릭 3

■ 일반 클래스 및 상속

class Box<T> {
    protected T ob;

    public void set(T o) {
        ob = o;
    }

    public T get() {
        return ob;
    }
}

class SteelBox<T> extends Box<T> {
    public SteelBox(T o) {
        ob = o;
    }
}

public class GenericInheritance {
    public static void main(String() args) {
        Box<Integer> iBox = new SteelBox<>(1234);
        Box<String> sBox = new SteelBox<>("Hello");

        System.out.println(iBox.get());
        System.out.println(sBox.get());
    }
}

일반 유형 SteelBox 제네릭 형식 Box에서 상속.

따라서 위의 예시와 같이 SteelBox는-상자 유형의 참조 변수로서의 인스턴스 지정됩니다.

.

■ 자리표시자

.

public static void peekBox(Box<?> box) {
    System.out.println(box);
}

.

위의 예에서 자리 표시자는 물음표 아이콘으로 표시됩니다.

상자-인스턴스 또는 상자-Box 기반 인스턴스 생성되었다

논거로 받아들일 수 있다. 그리고 아래 제네릭 메서드의 기능은 완전히 동일합니다.

.

public static <T> void peekBox(Box<T> box) {
    System.out.println(box);
}

■ 와일드카드의 상한 및 하한

.

public static void peekBox(Box<?> box) {
    System.out.println(box);
}

.

상자에 위 메서드의 인수로 T는 Number 또는 하위 클래스가 다음과 같은 제네릭 형식입니다.

배달을 인스턴스로만 제한하는 경우 다음과 같이 상한 자리 표시자를 사용합니다.

.

public static void peekBox(Box<? extends Number> box) {
    System.out.println(box);
}

// box 는 Box<T> 인스턴스를 참조하는 참조변수이다.
// 단 이때 Box<T> 인스턴스의 T는 Number 또는 이를 상속하는 하위 클래스이어야 함.

.

아래와 같이 하한이 있는 자리 표시자를 참조 변수에 사용할 수도 있습니다.

.

Box<? super Integer> box

// box 는 Box<T> 인스턴스를 참조하는 참조변수이다.
// Box<T> 인스턴스의 T 는 Integer 또는 Integer가 상속하는 클래스이어야 함.

.

즉, 위 메소드의 인자로 넘겨줄 수 있는 인스턴스 타입은 다음과 같다.

.

상자상자상자

.

■ 와일드카드로 제한하는 이유 : 상한의 목적

public static void outBox(Box<Toy> box) {
    Toy t = box.get();
    box.set(new Toy());
    System.out.println
}

위 메소드를 파싱하면 outBox 메소드는 내용물을 꺼내는 함수만 정의하려고 합니다.

프로그래머의 의도와 달리 set 메소드를 호출하여 인스턴스를 설정했습니다. 이 실수

컴파일 과정에서 발견되지 않기 때문에 파라미터 박스를 대상으로 얻을 수 있지만

설정이 불가능하도록 제한을 설정하는 것이 좋습니다.

public static void outBox(Box<? extends Toy> box) {
    Toy t = box.get();
    box.set(new Toy()); // ERROR
    System.out.println
}

위와 같이 “extends”키워드를 사용하여 상한을 설정하면 set 메소드를 통해 설정할 수 있습니다. 인스턴스를 저장할 수 없습니다.

Toy에서 상속받은 하위 클래스 Car가 있는 경우 위의 설명에서 상자-인스턴스를 매개변수로 전달

부모 클래스의 하위 클래스 인스턴스를 참조하는 것은 불가능하므로 box.set(new Toy()); 통화가 불가능해집니다.

.

■ 와일드카드를 사용한 제한 이유: 하한 제한의 목적

public static void inBox(Box<Toy> box, Toy n) {
    box.set(n);
    Toy myToy = box.get();
}

위 문장을 보면 inBox 메소드를 통해 인스턴스를 담고자 하는 프로그래머의 의도가 아닌,

get 메서드를 통해 인스턴스를 가져오는 동안 오류가 발생했지만 컴파일 과정에서 찾을 수 없습니다.

public static void inBox(Box<? super Toy> box, Toy n) {
    box.set(n);
    Toy myToy = box.get(); // ERROR
}

위와 같이 super 키워드를 사용하여 프로그래머가 의도한 대로 하한을 제한하는 경우

inBox 메서드에는 인스턴스를 저장하는 기능만 포함될 수 있습니다.

Toy가 상속받은 슈퍼클래스인 Plastic이 있다면 Box의 인스턴스입니다.

inBox 메서드 box.get()에 대한 인수로 전달됩니다. 반환되는 것은 플라스틱 인스턴스입니다.

따라서 하위 클래스 Toy의 참조 변수 myToy는 참조할 수 없습니다.