자바 제네릭 관련해서 질문이 총 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 의 제네릭 관련 자료를 봐도 마찬가지이고요;;;

간단하게 이해를 할 수 있는 방법이 없을까요?

 

 

답변 좀 부탁드리겠습니다;; 제가 뉴비라 -_-;;