제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될것이다.
예를 들어 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등이 있다.
제네릭에 익숙해질수록 마주치는 경고 수는 줄겠지만 새로 작성한 코드가 한번에 깨끗하게 컴파일되리라 기대하지는 말자.
대부분의 비검사 경고는 쉽게 제거할 수 있다. 코드를 다음처럼 잘못 작성했다고 해보자.
Set<Lark> exaltation = new HashSet();
💡 예시
Set<Lark> exaltation = new HashSet<>();
하지만 이보다 제거하기 훨씬 어려운 경고도 있다.
타입 안전함을 꼭 검증하고 비검사 경고를 숨기자.
선언 범위
@SuppressWarning 예제
한 줄이 넘는 메서드나 생성자에 달린 @SuppressWarnings 애너테이션을 발견하면 지역변수 선언 쪽으로 옮기자.
이를 위해 지역변수를 새로 선언하는 수고를 해야 할 수도 있지만, 그만한 값어치가 있을 것이다. ArrayList에서 가져온 다음의 toArray 메서드를 예로 생각해보자
public <T> T[] toArray(T[] a){
if(a.length < size){
return (T[]) Arrays.copyOf(elements, size, a.getClass());
}
System.arraycopy(elements, 0, a, 0, size);
if(a.length > size){
a[size] = null;
}
return a;
}
ArrayList를 컴파일하면 이 메서드에서 다음 경고가 발생한다.
💡 컴파일 시 뜨는 경고
애너테이션은 선언에만 달 수 있기 때문에 return 문에는 @SuppressWarnings를 다는 게 불가능하다.
return 문에 애너테이션을 담고 싶을 때에는 반환값을 담을 지역변수를 하나 선언하고 그 변수에 애너테이션을 달아주자.
public <T> T[] toArray(T[] a){
if(a.length < size){
// 수정한 부분
@SuppressWarnings("unchecked")
T[] result = (T[]) Arrays.copyOf(elements, size, a.getClass());
return result;
}
System.arraycopy(elements, 0, a, 0, size);
if(a.length > size){
a[size] = null;
}
return a;
}
이 코드는 깔끔하게 컴파일되고 비검사 경고를 숨기는 범위도 최소로 좁혔다.
달고난 후 해야할 것, 태도