왜 List<String>은 List<Object>가 될 수 없을까? (제네릭과 와일드카드가 공존하는 이유)

·
언어/Java
🧩 공변(covariant)과 무공변(invariant)이란?먼저 개념부터 짚고 가자.공변이란 String이 Object의 하위 타입이라면,List도 List의 하위 타입으로 간주하는 성질이다.하지만 자바 제네릭은 무공변이다.즉, 타입 인자가 다르면 하위 타입으로 인정하지 않는다.String extends Object // ✅ OKList → List // ❌ No이 때문에 다음 코드도 허용되지 않는다.List list = new ArrayList(); // ❌ 컴파일 에러🔒 왜 제네릭은 무공변으로 설계되었을까?이유는 단 하나, 타입 안정성(type safety) 때문이다.다음처럼 컴파일이 허용된다고 가정해보자.List list = new ArrayList();lis..