[아이템 28] 배열보다는 리스트를 사용하라

배열은 공변이고 제네릭은 불공변이다. 이는 Sub가 Super의 하위 타입이면 배열 Sub[]도 Super[]의 하위 타입이 된다. 배열은 실체화(reify)된다. 제네릭 배열은 런타임 시 ClassCastException이 발생할 수 있어 지원하지 않는다. E, List, List 같은 타입을 실체화 불가 타입 - 런타임에는 컴파일타임보다 타입 정보를 적게 가지는 타입 제네릭 컬렉션에서는 자신의 원소 타입을 담은 배열을 반환하는게 보통은 불가능하다. 또한 제네릭 타입과 가변인수 메서드(varargs method, 아이템53)를 함께 쓰면 해석하기 어려운 경고 메시지를 받게 된다. 배열로 형변환할 때 제네릭 배열 생성 오류나 비검사 형변환 경고가 뜨는 경우 대부분은 배열인 E[]대신 컬렉션인 List를 ..

[아이템 27] 비검사 경고를 제거하라

제네릭을 사용하면 컴파일러 경고를 많이 마주치게 되는데 할 수 있는 한 모든 비검사 경고를 제거해야한다. 모두 제거하면 해당 코드는 타입 안전성을 보장할 수 있다. ClassCastException이 발생할 일이 없다. @SuppressWarnings("unchecked")은 경고는 제거할 수 없으나 타입 안전성을 확보했을 때 해당 애너테이션을 달아 경고를 숨길 수 있다. @ SuppressWarnings 애너테이션은 항상 가능한 한 좁은 범위에 적용 @SuppressWarnings("unchecked") 애너테이션을 사용할 때면 그 경고를 무시해도 안전한 이유를 항상 주석으로 남겨야 한다.

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

casting 형 변환 오류로 대게 잘못된 형변환를 하려고 할 경우에 발생한다. 내 경우에는 hashMap에 담은 Object를 String으로 형 변환하려 (String)map.get("fruit")을 사용했을 때 해당 오류를 마주했다. hashMap에 담긴 Integer Object를 String으로 변경하고자 할 땐 String.valueOf(map.get("fruit"))을 사용해야 형변환 오류 없이 안정적으로 필요한 값을 뽑을 수 있다. 해당 내용에 대한 자세한 설명이 궁금해서 인터넷 및 Java API 문서를 보고 확인했더니 아래의 내용을 확인할 수 있었다. (String)을 사용하려는 object가 String인 경우에만 casting이 가능하면 String이 아닐 경우 ClassCastEx..