- 이전에는 받을 타입을 제한하기가 어려웠다. 그래서 도입된 문법
- Box < T > 이런 식으로 class 생성 가능
- 객체 생성할 때 변수 선언 시 <>안에 클래스 명을 넣어주므로 생성자 쪽에 쓸 때는 <> 안을 생략해도 된다.
- < T extends Class & Interface >
- Class에 해당하는 클래스를 상속(확장)한 T 클래스만 들어올 수 있음.
- T에 들어오는 클래스의 타입을 제한한다.
- interface끼리의 상속도 가능
- 대신 1개씩만 제한할 수 있음
class DDBoxDemo { public static void main(String[] args) { DBox<String, Integer> box1 = new DBox<>(); box1.set("Apple", 25); DBox<String, Integer> box2 = new DBox<>(); box2.set("Orange", 33); DDBox<DBox<String, Integer>, DBox<String, Integer>> ddbox = new DDBox<>(); ddbox.set(box1, box2); System.out.println(ddbox); } }
Apple & 25 Orange & 33
class DBox<S, N>{ private S str; private N num; public void set (S str, N num) { this.str = str; this.num = num; } @Override public String toString() { return str +" & " + num; } } public class ExampleMain2 { public static void main(String[] args) { DBox<String, Integer> box = new DBox<>(); box.set("Apple", 25); System.out.println(box);// Apple & 25 } }
Apple & 25
public static void main(String[] args) { Box<Integer> box1 = new Box<>(); box1.set(99); Box<Integer> box2 = new Box<>(); box2.set(55); System.out.println(box1.get() + " & " + box2.get()); swapBox(box1, box2); System.out.println(box1.get() + " & " + box2.get()); }
99 & 55 55 & 99
class Box7<T>{ private T t; public void set(T t) { this.t = t; } public T get() { return t; } } class BoxFactory3{ public static <T> Box7<T> makeBox(T t){ Box7<T> box = new Box7<>(); box.set(t); return box; } } public class ExampleMain4 { public static void main(String[] args) { Box7<String> sBox = BoxFactory3.<String>makeBox("Sweet"); System.out.println(sBox.get()); Box7<Double> dBox = BoxFactory3.<Double>makeBox(7.59); System.out.println(dBox.get()); } }
Sweet 7.59
public static < T > Box< T > makeBox(T t);
일 때
Box<T>
타입을 return .
class에 < T > 없을 때 사용할 수 있다.
class에는 static을 붙일 수 없으므로 (내부 클래스에는 가능한 듯) static method에 (보통)사용하기 위해 하는 작업인 듯
generic method는
public static <T extends Class> Box<T> makeBox(T t);
이런식으로 선언할 수 있다.