제네릭 <?> vs <? extends Object>

lsy·2022년 10월 28일
0

non-reifiable type vs reifiable type

non-reifiable type은 런타임에 아예 해당 타입에 대한 정보가 사라지는 것을 말한다.
반대로 reifiable type은 해당 타입에 대한 정보가 런타임에도 남아 있는 것을 의미한다.

<?> vs <? extends Object>

두 제네릭 타입은 컴파일 후에 같은 결과를 낸다. 그렇다면 두 타입의 차이는 무엇일까?

바로 <?>reifiable type이고 <? extends Object>non-reifiable type이라는 것이다.

따라서 타입 <?>는 다음과 같은 코드가 가능하다.

// 작동한다. 런타임에 <?> 타입에 대한 정보가 존재하기 때문. 
// <?>는 reifiable type
List list = new ArrayList<>();
boolean instanceTest = list instanceof List<?>;

하지만 다음과 같은 코드는 컴파일이 되지 않는다.

// 컴파일 에러. 런타임에 non-reifiable type 타입에 대한 정보가 존재하지 않기 때문. 
// <? extends Object>는 non-reifiable type
List list = new ArrayList<>();
boolean instanceTest = list instanceof List<? extends Object>;

Reference

https://stackoverflow.com/questions/8055389/whats-the-difference-between-and-extends-object-in-java-generics

profile
server를 공부하고 있습니다.

0개의 댓글