자바 제네릭 관련해서 질문이 총 3가지인데요;;
분류를 좀 해봤습니다.
질문1>
자바 API 에는 Class 라는 클래스가 있는데요, 이 안에는 asSubclass라는 메소드가 있습니다.
정의는 다음과 같습니다.
public <U> Class<? extends U> asSubclass(Class<U> clazz){...}
여기서 앞쪽에 붙은 <U> 의 기능은 asSubclass의 매개변수로 있는 Class<U> clazz에 대한
타입 호완성을 컴파일러 차원에서 보장해주기 위함인가요?
즉, 다음의 코드와 같은 의미로 사용이 된 것인가요?
------------------------------------------------------------------------------------
class A<T>{
private T a;
public T get(){..} // a를 반환
public void put(T element){..} // a에 element 입력
/* // 다음의 코드는 Error.
public void rebox(Box<?> box){
box.put(box.get());
}*/
public void rebox(Box<?> box) {
reboxHelper(box);
}
private<V> void reboxHelper(Box<V> box) { // 컴파일러 차원에서 타입에 대한 호환성을 보장.
box.put(box.get()); // 반환하는 타입은 Object 형이 아닌 <V>형.
}
}
------------------------------------------------------------------------------------
질문2>
public static <? extends Unit> void printAll(ArrayList<?> list, ArrayList<?> list2){..}
이렇게 메소드를 정의하면 에러가 나는데요.
이것은 그냥 와일드카드 \'?\' 가 애초에 이런식으론 사용을 못하게 만들어 놨을 뿐인건가요?
아니면 뭔가 특별한 이유라도 있는건가요?
질문3>
다음과 같은 코드가 있다고 가정합니다.
------------------------------------------------------------------------------------
class CCC<Z>{
private Z w;
public Z get(){
return w;
}
public void testMethod(CCC<?> c){
System.out.println(c.get()); // c.get() 이 반환하는 type 은 Object
}
}
------------------------------------------------------------------------------------
이 코드에서 굵음 표시로 되어있는 부분이 궁금합니다.
c.get() 의 타입이 Object 형이라고 많은 자료에서 서술이 되어있는데..
\'정확하게\' 이해가 가질 않습니다 ㅜㅠ (왜냐면, 질문1에서 reboxHelper 메소드에 있는
box.get() 은 Object가 아닌, <V> 형을 리턴하니깐요.)
어떤 경우엔 제네릭 타입이 Object 형을 리턴하고, 어쩔 땐 암묵적인 제네릭 타입을
그대로 컴파일러 차원에서 인정하고 -_-;
이걸 무슨수로 구분하는 건가요;;
오국환님께서 번역하신 IBM 의 제네릭 관련 자료를 봐도 마찬가지이고요;;;
간단하게 이해를 할 수 있는 방법이 없을까요?
답변 좀 부탁드리겠습니다;; 제가 뉴비라 -_-;;
아......... 모르겠다 -_-
정말 검색도 하고 그랬는데 몰라서 묻는거거든요..ㅜㅠ 제발 갈켜주세요
아... 질문을 너무 이상하게 했나... ;;.. 일단 질문을 조금 더 다듬어서 내일 다시 올려볼게요.
질문1은 질문에 답이 있고
질문2에서 ? extends Unit 클래스 선언하는 데서 와일드 카드를 쓰는 건 int ? = 1; 이러는 거랑 똑같은거고
질문3 CCC<?> != CCC<Z> 더 풀면, new CCC<BigDecimal>().testMethod( new CCC<String> ); 이렇게 된다는 거임.
new CCC<String> => new CCC<String>()