java2019. 9. 16. 17:39

목적:

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
Posted by easy16