■ 일반 클래스 및 상속
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
따라서 위의 예시와 같이 SteelBox는
.
■ 자리표시자
.
public static void peekBox(Box<?> box) {
System.out.println(box);
}
.
위의 예에서 자리 표시자는 물음표 아이콘으로 표시됩니다.
상자
논거로 받아들일 수 있다. 그리고 아래 제네릭 메서드의 기능은 완전히 동일합니다.
.
public static <T> void peekBox(Box<T> box) {
System.out.println(box);
}
■ 와일드카드의 상한 및 하한
.
public static void peekBox(Box<?> box) {
System.out.println(box);
}
.
상자에
배달을 인스턴스로만 제한하는 경우 다음과 같이 상한 자리 표시자를 사용합니다.
.
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는 참조할 수 없습니다.
