2018-4-8 TIL JAVA Generic(2)
타겟타입
- 자바의컴파일러는 생략된 자료형 정보에 대해서 유추를 할 수 있다. 컴파일러가 생각보다 자료형을 유추를 하는 것이 다양하다.
package yoon;
class EmptyBoxFactory {
public static <T> Box2<T> makeBox() {
Box2<T> box = new Box2<>();
return box;
}
}
public class TargetTypes {
public static void main(String [] args) {
Box2<Integer> iBox = EmptyBoxFactory.<Integer>makeBox();
iBox.set(25);
System.out.println(iBox.get());
}
}
//result
25
- makeBox메소드에서 인자를 전달받지 않았다. 위의 메소드에서는 인자를 전달받지 않았으므로, T에 대한 타입인자를 전달해야한다.
- Box
iBox = EmptyBoxFactory. makeBox() - T의 유추에 사용된 정보 Box2
를 가리켜 '타겟타입'이라고한다.
와일드카드
class Unboxer {
public static <T> T openBox(Box2<T> box) {
return box.get();
}
// 상자안의 내용물을 확인하는 기능의 제네릭 메소드
// ?는 와일드카드 기호이다
public static <T> void peekBox(Box2<?> box) {
System.out.println(box);
}
}
public class WildcardUnboxer {
public static void main(String [] args) {
Box2<String> box = new Box2<>();
box.set("So Simpe String");
Unboxer.peekBox(box);
}
}
//result
So Simple String
- Box2<?> box와 같이 ?기호로 표시되는 와일드카드를 선언하면, Box2
, Box2 와 Box2 를 기반으로 생성된 매개변수를 전달받을 수 있다.
public static <T> void peekBox(Box<T> box) {
System.out.println(box);
// 제네릭 메소드 정의
}
public static void peekBox(Box<?> box) {
System.out.println(box);
// 와일드카드 기반의 메소드 정의
}
- 위의 두 메소드는 기능이 완전 동일하지만, 코드가 조금 더 간결해지는 이유로 와일드카드 기반의 메소드를 더 선호한다.
Written on April 8, 2018