목적:
1, 명시적으로 타입을 지정하여 형변환을 사용하지 않음
2, 런타임이 아닌 컴파일 타임에 오류를 찾아낼 수 있다.
3, 매개변수로 Generic class를 넘겨줄 경우, ?( wildcard ) 타입을 사용한다.
넘어온 객체의 경우, 어떤 클래스의 인스턴스인지를 판별하기 위해 instanceof 예약어를 사용.
4, <? extends Object > : Object 클래스를 상속한 녀석만 허용 ( 넘어오는 Type을 제한할 수 있다.)
Bounded Wildcard라고 불린다. 해당 녀석도 값을 할당하는 것은 불가능하므로 조회용으로 사용.
private void doTest() { CastingGenericDTO d1 = new CastingGenericDTO(); CastingGenericDTO d2 = new CastingGenericDTO(); CastingGenericDTO<?> d3 = new CastingGenericDTO(); d1.setObject(String.valueOf(123)); d2.setObject(new StringBuilder().append("sb")); d3.setObject(String.valueOf(456));//wildcard 사용하는 경우 값을 할당하는 것이 불가능. //The method setObject(capture#1-of ?) in the type CastingGenericDTO<capture#1-of ?> is not applicable for the arguments (String) //printDTO(d1); printAllDTO(d1); printAllDTO(d2); } void printDTO(CastingGenericDTO d) {//인자로 전달시, CastingGenericDTO 객체만 넘겨받을 수 있다. System.out.println(d.getObject()); } void printAllDTO(CastingGenericDTO<?> d) { //해결책 '?' 사용 -> wildcard 타입 if ( d.getObject() instanceof StringBuilder ) System.out.println("StringBuilder : "+ d.getObject()); else if ( d.getObject() instanceof String ) { System.out.println("String : "+ d.getObject()); } }
5, Wildcard/ Bounded Wildcard 모두 매개변수로 넘어온 객체에 대해 값을 할당할 수 없다는 단점.
6, 메소드를 아래와 같이 정의하면 매개변수로 넘어온 객체에 값을 할당 가능하다.
public /<T/> void setDataDTO(CastingGenericDTO c, T addValue) {
c.setObject(addValue);
}
public /<T/> void setDataDTO2(CastingGenericDTO c, T addValue) {
c.setObject(addValue);
}
public <S, T extends Object > void setDataDTO3(CastingGenericDTO c, T addValue, S another) {
c.setObject(addValue);
}
출처 : 자바의 신
'java' 카테고리의 다른 글
Runnable interface와 Thread class (0) | 2019.09.17 |
---|---|
Simple HashSet 및 Iterator 사용 예제 (0) | 2019.09.16 |
System class 의 기본 기능 활용 (0) | 2019.09.16 |
Deprecated, SuppressWarnings 예시 (0) | 2019.09.15 |
Nested class의 개념 (0) | 2019.09.15 |