반응형

지네릭 타입의 형변환

  • 지네릭 타입과 원시 타입 간의 형변환은 바람직 하지 않다.(경고 발생)

지네릭 타입과 원시 타입간의 형변환은 바람직 하지 않다.

예를 들면, 위 코드처럼, 지네릭 타입의 참조변수를 원시타입의 참조변수로 형변환 한다던지,
원시타입의 참조변수를 지네릭타입으로 형변환 하는 것은 바람직 하지 않다. 가능은 한데 바람직 하지 않은것 이다.

 

  • 서로 다른 타입이 대입된 지네릭 타입들 끼리는 형변환 할 수 없다. (에러 발생)

서로 다른 타입이 대입된 지네릭 타입들 끼리는 형변환 할 수 없다. 에러가 발생한다.

 

  • 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능

와일드 카드가 사용된 지네릭 타입으로는 형변환이 가능하다.

new Box<String>();을 Box<Object>타입의 참조변수로 가리키는 것은 에러이다.
그러나, new Box<String>(); 을 와일드 카드인 Box<? extends Object> 타입의 참조변수로 가리키는 것은 가능하다.
즉, new Box<String();을 (Box<? extends Obejct>)new Box<String>(); 처럼
와일드 카드가 사용된 지네릭 타입으로 형변환 하는 것은 가능하다는 뜻이다.
Object와 그 자손들이 가능한데, String은 Obejct 자손이므로 OK이다.

 


 

지네릭 타입의 제거

  • 컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.

컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.
지네릭 타입은 컴파일 때까지만 존재한다. 컴파일러가 제거하기 때문이다.

좌측의 코드를 컴파일러가 우측처럼 바꾼다.
지네릭 타입을 다 제거한다.그리고 적절한 타입을 넣는다.
원래는 우리가 처음에 Object대신에 <T>를 썻는데,
컴파일하면 <T> → Object로 바뀐다. (왜그러냐면 하위 호완성 때문에 그렇다.)

위 코드의 경우, <T extends Fruit>로 T가 Fruit 혹은 그 자손이어야 한다는 제한이 있으므로,
T가 Fruit로 바뀐다.

지네릭스의 장점은 형변환을 생략할 수 있는 것이다.
그런데 지네릭 타입 제거 후에, 타입이 불일치하면, (컴파일러가)형변환을 추가하게 된다.

우리가 형변환을 생략해도 된다고해서 형변환을 안해도 되는 것이아니라,
컴파일러가 우리대신 추가를 해준다.

그리고 와일드 카드가 포함된 경우, 와일드 카드가 제거될 때 적절한 타입으로 형변환 추가가 이루어진다.

 

제일 중요한 것은, 컴파일 타임에 지네릭 타입이 없어진다는 사실이다.

반응형

'JAVA' 카테고리의 다른 글

열거형에 멤버 추가하기  (0) 2022.05.09
열거형  (0) 2022.05.08
와일드 카드, 지네릭 메서드  (0) 2022.05.07
제한된 지네릭 클래스, 지네릭스의 제약  (0) 2022.05.04
Iterator, HashMap과 지네릭스  (0) 2022.05.04