publicclassTypeParam<T> { T some; //데이터타입 : T, 변수명 = some T some1; //데이터타입 : T, 변수명 = some1 publicTypeParam(T some, T s1){ //생성자 (파라미터2개 : 파라미터의 데이터타입은 T이다) this.some = some; //멤벼변수와 파라미터 이름이 같아서 this를 사용 some1 = s1; //멤버변수와 파라미터 이름 달리해서 this생략가능 } public <P> voidmethod1(P p){ //파라미터 데이터 타입이 p System.out.println("클래스 레벨의 T : "+some.getClass().getName()); System.out.println("파라미터 : "+p.getClass().getName()); }
public <P> P method2(P p){ //리턴값의 데이터타입 p인 메서드 System.out.println("클래스 레벨의 T : "+some.getClass().getName()); System.out.println("파라미터 : "+ p.getClass().getName()); return p; } publicstaticvoidmain(String[] args){ //데이터타입 T -> String으로 지정 후 객체생성 TypeParam<String> tpmt = new TypeParam<>("멤버변수some값설정", "멤버변수some1값설정"); //some에다가 파람값 넣어줌 //멤버변수출력 System.out.println(tpmt.some); System.out.println(tpmt.some1); //파라미터 타입 명시하지않음 : 컴파일러가 매개변수의 값을 보고 파라미터 p의 데이터 타입을 결정 tpmt.method1(10); tpmt.method2(10);
//파라미터 타입 직접 지정 : 파라미터타입 p -> Long으로 지정 tpmt.<Long>method2(20L); }
}
만약 객체생성시 TypeParam<String> tpmt = new TypeParam<>()하고싶다면 어떻게하면될까? 생성자 오버로딩을 하면된다.
1 2 3 4
//생성자오버로딩 publicTypeParam(){ //생성자 ( } TypeParam<String> tpmt = new TypeParam<>();
에러가 뜨지않고 객체생성은 잘되지만 멤버변수의 데이터타입이 제네릭이기때문에 멤버변수에 값을 넣을수도없고 파라미터도 없기때문에 현 코드에서는 쓸수있는 방법이 없다.
2-3 와일드카드의 사용
제네릭 메서드에서는 사용되는 타입 파라미터에 제한을 두기 위해 와일드카드로 ‘?’를 사용
단독사용 가능
extends나 super와 함께 사용가능.
기호
설명
<?>
타입의 제한이 없으며 <? extends Object>와 동일
<? extends T>
와일드카드의 상한을 제한. 이 타입 파라미터에는 T와 T를 상속받은 자손만 대입할 수 있다.