non-reifiable type은 런타임에 아예 해당 타입에 대한 정보가 사라지는 것을 말한다.
반대로 reifiable type은 해당 타입에 대한 정보가 런타임에도 남아 있는 것을 의미한다.
두 제네릭 타입은 컴파일 후에 같은 결과를 낸다. 그렇다면 두 타입의 차이는 무엇일까?
바로 <?>
는 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>;