타입 파라미터에 지정되는 구체적인 타입을 상속 및 구현 관계를 이용해서 제한할 수 있다.
Public <T extends 상위타입> 리턴타입 메소드(매개변수1,매개변수2, ...) { ... }
--> 상위 타입은 클래스 뿐만 아니라 인터페이스도 가능하다.
*인터페이스라고해서 extends 대신 implements를 사용하지 않는다.
*여기서 extends는 상속의 개념이 아니라 종류라는 의미라고 생각할 것
- 타입 파라미터를 대체할 구체적인 타입
--> 상위타입이거나 하위 또는 구현 클래스만 지정할 수 있다.
* 즉, 상위타입에 클래스가 왔다면 자식클래스, 상위타입에 인터페이스가 왔다면 구현클래스가 타입파라미터가 될 수 있다.
- 주의할 점
--> 메소드의 중괄호 { } 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버(필드, 메소드)만이 사용 가능하다.
--> 하위 타입에만 있는 필드와 메소드는 사용할 수 없다!
예제>>
제한된 타입 파라미터를 갖는 Util클래스
public class Util {
public static <T extends Number> int compare(T t1, T t2) {
double v1 = t1.doubleValue();
double v2 = t2.doubleValue();
return Double.compare(v1, v2);
}
}
--> public static <T extends Number> int compare(T t1, T t2)
compare메소드의 타입 파라미터<T>에 올 수 있는 타입 파라미터는 Number클래스의 타입 파라미터이거나,
Number클래스의 자식클래스의 타입 파라미터가 될 수 있다.
--> double v1 = t1.doubleValue();
Number클래스의 doubleValue()메소드 사용
Util클래스의 compare메소드의 구현부{}에서는 상위 타입인 Number클래스에 선언된 필드,메소드만을 사용할 수 있다.
--> return Double.compare(v1, v2);
Double클래스의 compare(v1,v2)메소드로 v1<v2 : -1 , v1=v2 : 0 , v1>v2 : 1 리턴한다.
실행클래스
public class BoundedTypeParameterExample {
public static void main(String[] args) {
int result1 = Util.compare("a", "b"); //(X)
int result1 = Util.compare(10, 20);
System.out.println(result1);
int result2 = Util.compare(4.5, 3);
System.out.println(result2);
}
}
실행결과
-1
1
--> int result1 = Util.compare("a", "b");
Util클래스의 compare메소드는 제한된 타입 파라미터로 Number클래스 또는 Number클래스의 자식(하위)클래스만을 가지므로
String타입을 파라미터로 가질수 없다.
--> int result1 = Util.compare(10, 20);
10과 20은 Integer이고, Integer는 Number클래스를 상속받는 자식 클래스이므로 타입파라미터로 올 수 있다.
원래는 int result1 = Util.<Integer>compare(10, 20);으로 명시적으로 써줘도 되지만 컴파일러가 매개값을 보고 유추할 수 있으므로
생략한다.
* 정리 *
- 제네릭을 이용하여 타입 파라미터를 가지는 메소드를 가질 수 있다.
- 타입 파라미터는 상속, 구현 관계를 이용해서 제한하여 사용할 수 있다.
- 제한된 타입 파라미터는 명시된 상위타입, 자식클래스, 구현클래스가 될 수 있다.
- 제한된 타입 파라미터를 사용하는 메소드의 구현부{}에는 반드시 상위타입에 정의되어 있는 필드,메소드 만을 사용할 수 있다.
본 포스팅은 이것은 자바다 책을 참고하여 작성하였습니다.
'Java 공부' 카테고리의 다른 글
13장 제네릭(Generic)(6)_제네릭 타입의 상속과 구현 (0) | 2019.05.25 |
---|---|
13장 제네릭(Generic)(5)_와일드 카드 타입 (0) | 2019.05.24 |
13장 제네릭(Generic) (3)_제네릭 메소드 (0) | 2019.05.22 |
13장 제네릭(Generic) (2)_멀티 타입 파라미터 (0) | 2019.05.22 |
13장 제네릭(Generic) (0) | 2019.01.20 |