제네릭은 타입 소거
라는 방식으로 동작합니다. 제네릭 타입을 지정하더라도 컴파일러가 컴파일 시 타입을 소거하기 때문에 런타임에 실제로는 Object
타입과 같이 작동을 하게 되는데요, T
타입으로 제네릭 선언 -> 컴파일 시 Object
로 타입 소거 -> 사용 시 T
타입으로 형변환의 과정을 거치게 됩니다. 따라서 제네릭 T
자리에 들어오는 타입은 반드시 Object
의 하위 타입이어야 합니다. 아니라면 Object
로 형변환을 할 수 없기 때문이죠. 그런데 모든 reference type은 Object
의 하위 타입이지만, primitive 타입은 Object
의 하위 타입이 아닙니다. 때문에 제네릭으로는 primitive 타입을 쓸 수 없는 것이죠.
그래서 제네릭에 primitive type을 사용하고 싶다면 어쩔 수 없이 해당 타입의 wrapper type을(int
-> Integer
, double
-> Double
등) 대신 사용해야 합니다.