예제1)
// 제너릭 : 멤버변수나 멤버함수를 자료형별로 구할 필욕없이 하나만 구현해서 사용 가능하도록 하는 기능. 뾰족괄호
public class Test3 {
public static void main(String[] args) {
Box<Integer> b1=new Box<Integer>(); //class Box<T>의 뾰족괄호안에 Integer이 들어가서 T는 모두 Integer이 대입된다.
b1.set(new Integer(10));
Integer ii=b1.get();
System.out.println(ii);
b1.write();
System.out.println();
Box<String> b2=new Box<String>();
b2.set("테스트");
String ss=b2.get();
System.out.println(ss);
b2.write();
System.out.println();
Box b3=new Box(); // 경고 나옴 // 뾰족괄호 없이 객체생성함. 이럴때는 반드시 캐스팅이 필요하다.
b3.set(new Integer(3));
Integer aa=(Integer)b3.get(); // 반드시 캐스팅 필요
b3.write();
b2.print(new Float(10.0f));
b2.print(new String("서울"));
b2.test(new Integer(20));
// b2.test(new String("서울")); //오류 : String은 number의 하위 클래스가 아니므로
}
}
// ↓↓↓↓↓클래스에 적용된 제너릭↓↓↓↓↓
class Box<T>{ // 뾰족괄호 안에 문자는 아무거나 써도 상관없지만 일반적으로 Type의 T를 쓴다.
private T tt;
public void set(T tt){
this.tt=tt;
}
public T get() {
return tt;
}
public void write() {
System.out.println(tt.getClass());
}
public <U> void print(U u) { // 메소드에 적용된 제너릭
System.out.println(u.getClass().getName());
}
public <U extends Number> void test(U u) { // //메소드에 적용한 제너릭을 상속한 제너릭
System.out.println(u.getClass().getName());
}
}