Item27
비검사 경고를 제거하라
- 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것이다
- 비검사 형변환 경고, 비검사 메소드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등이다
- 할 수 있는 한 모든 비검사 경고를 제거하라
- 모두 제거한다면 코드의 타입 안정성이 보장되어 런타임에 ClassCastException이 발생할 일이 없다
1 개요
Set<String> words = new HashSet();
- 위 코드를
-Xlint:unchecked옵션과 함께 javac로 컴파일해보면- 기본적으로 Java 컴파일러는 비검사 경고를 활성화하지 않으며 이를 사용하기 위해서는 컴파일러에 -Xlint:uncheck 옵션을 주어야한다.
Item27.java:15: warning: [unchecked] unchecked conversion
Set<String> words = new HashSet();
^
required: Set<String>
found: HashSet
- 위와 같은 경고가 나온다
Set<String> words = new HashSet<>();
HashSet을 Raw 타입으로 사용했기 때문에 나타난 비검사 경고이다.- 이를 해결하기 위해서는 HashSet에도
HashSet<String>과 같이 타입 매개변수를 명시하던가 자바 7부터 지원하는 제네릭 타입 추론을 활용하여 다이아몬드 연산자<>를 사용할 수 있다.
2 @SuppressWarninigs
- 경고를 제거할 수 없지만 타입 안전하다고 확신한다면 @SuppressWarninigs("unchecked") 애노테이션을 달아 경고를 숨겨라
SuppressWarninigs.java
package java.lang;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}