✍ 부모 타입에 제네릭 타입이 지정되어 있을 경우
서브클래스가 부모 클래스를 상속 받을 때, 부모의 타입 파라미터를 서브 클래스 타입 파라미터로 명시해야 한다
class Class1 <P> {} // 부모 클래스
interface Interface1 <Q> {} // 부모 인터페이스
class Subclass<P, Q, R> extends Class1 <P> implements Interface1 <Q> {
P var1; // 슈퍼클래스 Class1의 타입 P
Q var2; // 슈퍼클래스 Interface1의 타입 Q
R var3; // 자신의 타입 R
}
=> Subclass가 Class1 클래스와, Interface1을 상속받는다.
Class1의 제네릭 타입은 P, Interface1의 제네릭 타입은 Q이다. 자식 클래스인 Subclass에 부모 클래스들의 타입들을 명시해주어야 하므로
Subclass의 제네릭 타입으로 <P, Q, R>을 작성했다. 이때 R은 Subclass 본인의 타입이다.
public static void main(String[] args) {
Subclass<Integer, String, Object> sc = new Subclass();
sc.var1 = 1; // 정수 타입
sc.var2 = "자바"; // 문자열
sc.var3 = 3.14; // Object => 모든 타입이 올 수 있음
}
=> 사용자 정의 타입을 지정하였으므로, 메인 메서드에서 원하는 타입으로 데이터를 지정할 수 있다.
변수에는 지정한 제네릭 타입으로만 데이터를 저장할 수 있다.
✍ 제네릭 타입에 대한 파라미터 타입 제한
- 제네릭 타입 파라미터 선언 시 Object 타입과 그 자식 타입들을 모두 사용 가능하다
- 필요에 따라 파라미터 타입에 올 수 있는 데이터타입을 제한할 수 있다
class GenericClass <T extends Number> {}
=> 파라미터에 대한 서브클래스 타입으로 제한하는 경우에는
class 클래스명 <타입파라미터 extends 클래스타입> { } 형식이 기본 문법이다.
이때 타입 파라미터는 extends 뒤의 클래스 타입과 동일한 타입과 하위 타입만 지정이 가능하다.
즉 위의 코드의 경우, 타입파라미터 T에는 Number 클래스보다 상위 타입을 지정할 수 없다는 말이다.
Number 클래스 혹은 Number 클래스의 하위타입인 Interger, Double 등으로 만 변환이 가능하다.
💻
=> GerericClass의 타입파라미터는 Number타입과 Number의 하위 타입만 올 수 있다.
그러므로 String 타입을 지정하면 오류가 발생한다.
'개발 > Java' 카테고리의 다른 글
[Java] StringBuilder & StringBuffer (0) | 2023.03.11 |
---|---|
[Java] Thread = 쓰레드 (0) | 2023.03.11 |
[Java] 제네릭 사용 시 주의사항 (0) | 2023.03.11 |
[Java] Generic - 제네릭 (0) | 2023.03.09 |
[Java] Collection - Map (0) | 2023.03.07 |