[java] Java에서 SuppressWarnings ( “체크되지 않은”) 란 무엇입니까?

때로는 코드를 살펴볼 때 많은 메소드가 주석을 지정하는 것을 볼 수 있습니다.

@SuppressWarnings("unchecked")

이것은 무엇을 의미 하는가?



답변

때로는 자바 제네릭 그냥 당신이 당신이 원하는 일을하지 않으며, 당신은 효과적으로 당신이 정말하고있는 것이 있음을 컴파일러에게 필요 합니다 실행시 법적 될 수 있습니다.

나는 일반적인 인터페이스를 조롱 할 때 일반적 으로이 고통을 발견하지만 다른 예제도 있습니다. 그것은 경고를 피하는 것이 아니라 그것을 억제하는 방법을 해결하려고 노력 일반적으로 가치가합니다 ( 자바 제네릭 FAQ는 여기에 있습니다)하지만 때로는 심지어 경우 입니다 수, 그렇게 많은 경고를 억제하는 깔끔한 것을 모양에서 코드를 굴절. 이 경우 항상 설명 주석을 추가하십시오!

동일한 “제네릭 FAQ “에는 “”확인되지 않은 “경고 란 무엇입니까?”로 시작하는이 주제에 대한 여러 섹션이 있습니다. -읽을 가치가 있습니다.


답변

캐스트와 같은 검사되지 않은 일반 작업 (예외 아님)에 대한 컴파일 경고를 억제하기위한 주석입니다. 그것은 본질적으로 프로그래머가 특정 코드를 컴파일 할 때 이미 알고있는 것에 대해 알리고 싶지 않다는 것을 암시합니다.

이 특정 주석에 대한 자세한 내용은 여기를 참조하십시오.

경고

또한 오라클은 주석 사용법에 대한 튜토리얼 문서를 제공합니다.

주석

그들이 넣을 때

“제네릭이 등장하기 전에 작성된 레거시 코드와 인터페이스 할 때 ‘확인되지 않은’경고가 발생할 수 있습니다 (제네릭 제목의 단원에서 설명).”


답변

또한 현재 Java 유형 시스템 버전이 귀하의 경우에 충분하지 않을 수도 있습니다. 이 문제를 해결하기 위해 JSR 제안 / 해킹 이 몇 가지있었습니다 : Type tokens, Super Type Tokens , Class.cast ().

이 억압이 실제로 필요한 경우 가능한 한 좁히십시오 (예 : 클래스 자체 또는 긴 메소드에 넣지 마십시오). 예를 들면 :

public List<String> getALegacyListReversed() {
   @SuppressWarnings("unchecked") List<String> list =
       (List<String>)legacyLibrary.getStringList();

   Collections.reverse(list);
   return list;
}


답변

SuppressWarning의 주석은 주석 요소 억제 컴파일러 경고에 사용된다. 특히,이 unchecked범주를 사용하면 검사되지 않은 유형 캐스트의 결과로 생성 된 컴파일러 경고를 억제 할 수 있습니다.


답변

간단히 말해 : 컴파일러가 형식 안전성을 보장 할 수 없음을 나타내는 경고입니다.

JPA 서비스 방법 예 :

@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
    Query query = entitymanager.createQuery("SELECT u FROM User u");
    return (List<User>)query.getResultList();
}

@SuppressWarnings ( “unchecked”)에 주석을 달지 않으면 ResultList를 반환하려는 행에 문제가 있습니다.

바로 가기 형식 안전의 의미 : 프로그램은 오류 및 경고없이 컴파일되고 런타임에 예기치 않은 ClassCastException을 발생시키지 않으면 형식 안전으로 간주됩니다.

나는 http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html에서 빌드합니다 .


답변

Java에서 제네릭은 삭제 유형을 통해 구현됩니다. 예를 들어, 다음 코드입니다.

List<String> hello = List.of("a", "b");
String example = hello.get(0);

다음과 같이 컴파일됩니다.

List hello = List.of("a", "b");
String example = (String) hello.get(0);

그리고 List.of으로 정의된다.

static <E> List<E> of(E e1, E e2);

유형 삭제 후 어느 것이됩니다.

static List of(Object e1, Object e2);

컴파일러는 런타임에 제네릭 형식이 무엇인지 알지 못하므로 이와 같이 작성하면됩니다.

Object list = List.of("a", "b");
List<Integer> actualList = (List<Integer>) list;

Java Virtual Machine은 프로그램을 실행하는 동안 일반 유형이 무엇인지 알지 못하므로 Java Virtual Machine과 마찬가지로 컴파일 및 실행됩니다. List .

그러나 이제이 줄을 추가하십시오.

Integer hello = actualList.get(0);

ClassCastExceptionJava 컴파일러가 암시 적 캐스트를 삽입했기 때문에 JVM은 예기치 않은을 발생 시킵니다.

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

unchecked경고는 캐스트가 다른 곳에서 예외를 throw하는 프로그램이 발생할 수 있음을 프로그래머를 알려줍니다. 경고를 표시하지 @SuppressWarnings("unchecked")않으면 컴파일러는 프로그래머에게 코드가 안전하다고 생각하고 예기치 않은 예외가 발생하지 않는다고 알립니다.

왜 그렇게 하시겠습니까? Java 유형 시스템은 가능한 모든 유형 사용 패턴을 표현하기에 충분하지 않습니다. 때로는 캐스팅이 안전하다는 것을 알 수 있지만 Java는 그렇게 말하는 방법을 제공하지 않습니다. 이와 같은 경고를 숨기고 @SupressWarnings("unchecked")프로그래머가 실제 경고에 집중할 수 있습니다. 예를 들어Optional.empty() 값을 저장하지 않는 빈 옵션의 할당을 피하기 위해 싱글 톤을 반환합니다.

private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

빈 캐스트 옵션에 저장된 값을 검색 할 수 없으므로 예기치 않은 클래스 캐스트 예외의 위험이 없으므로이 캐스트는 안전합니다.


답변

컴파일러 경고를 억제하고 작성한 코드가 그에 따라 합법적임을 제네릭에게 알릴 수 있습니다.

예:

@SuppressWarnings("unchecked")
public List<ReservationMealPlan> retreiveMealPlan() {
     List<ReservationMealPlan> list=new ArrayList<ReservationMealPlan>();
    TestMenuService testMenuService=new TestMenuService(em, this.selectedInstance);
    list = testMenuService.getMeal(reservationMealPlan);
    return list;
 }