문제

언젠가 코드를 살펴보면 많은 방법이 주석을 지정합니다.

@SuppressWarnings("unchecked")

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

도움이 되었습니까?

해결책

때로는 Java Generics가 원하는 것을 할 수 없으며 컴파일러에게 실제로하고있는 일을 효과적으로 알릴 필요가 있습니다. ~ 할 것이다 실행 시간에 합법적입니다.

나는 보통 일반 인터페이스를 조롱 할 때 이것이 고통을 발견하지만 다른 예도 있습니다. 일반적으로 경고를 억제하는 대신 경고를 피하는 방법을 해결하려고 노력할 가치가 있습니다 ( 자바 제네릭 FAQ 여기서 도움이되지만 때로는 그렇더라도 ~이다 가능하면 경고를 억제하는 것이 깔끔한 코드를 너무 많이 구부릴 수 있습니다. 이 경우 항상 설명적인 의견을 추가하십시오!

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

다른 팁

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

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

억압

또한 Oracle은 주석 사용에 관한 몇 가지 자습서 문서를 제공합니다.

주석

그들이 넣을 때

"제네릭이 출현하기 전에 (제네릭이라는 제목의 수업에서 논의 됨) 레거시 코드와 인터페이스 할 때 '확인되지 않은'경고가 발생할 수 있습니다."

또한 현재 Java 유형 시스템 버전이 귀하의 경우에는 충분하지 않다는 것을 의미 할 수 있습니다. 몇 가지가있었습니다 JSR 제안 / 해킹을 해결하기위한 해킹 : 유형 토큰, 슈퍼 유형 토큰, class.cast ().

이 억압이 정말로 필요하다면 가능한 한 많이 좁히십시오 (예 : 클래스 자체 나 긴 방법에 넣지 마십시오). An example:

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

   Collections.reverse(list);
   return list;
}

그만큼 억압 주석은 주석이 달린 요소에 대한 컴파일러 경고를 억제하는 데 사용됩니다. 구체적으로, unchecked 범주를 사용하면 확인되지 않은 유형 캐스트의 결과로 생성 된 컴파일러 경고를 억제 할 수 있습니다.

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

예를 들어 JPA 서비스 방법 :

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

여기서 @suppresswarnings ( "확인되지 않은")를 anotate하지 않았다면, 결과 목록을 반환하고 싶은 줄에 문제가 있습니다.

바로 가기 유형 안전 수단에서 : 프로그램은 오류 및 경고없이 컴파일되면 런타임에 예상치 못한 ClasscastException S를 올리지 않으면 유형-안전한 것으로 간주됩니다.

나는 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);

그리고 JVM은 예상치 못한 것을 던질 것입니다 ClassCastException, Java 컴파일러가 암시 적 캐스트를 삽입함에 따라.

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

an unchecked 경고는 프로그래머에게 캐스트가 프로그램이 다른 곳에 예외를 던질 수 있다고 말합니다. 경고를 억제합니다 @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;
 }

한 가지 요령은 일반적인 기본 인터페이스를 확장하는 인터페이스를 만드는 것입니다 ...

public interface LoadFutures extends Map<UUID, Future<LoadResult>> {}

그런 다음 캐스트 전에 인스턴스로 확인할 수 있습니다 ...

Object obj = context.getAttribute(FUTURES);
if (!(obj instanceof LoadFutures)) {
    String format = "Servlet context attribute \"%s\" is not of type "
            + "LoadFutures. Its type is %s.";
    String msg = String.format(format, FUTURES, obj.getClass());
    throw new RuntimeException(msg);
}
return (LoadFutures) obj;

내가 아는 한, 지금은 제네릭에 대한 경고를 억제하는 것과 관련이 있습니다. 제네릭은 JDK 5보다 초기에 JDK 버전으로 지원되지 않는 새로운 프로그래밍 구성이므로 오래된 구조물과 새로운 구성을 혼합하면 예상치 못한 결과가 발생할 수 있습니다.

컴파일러는 프로그래머에게 그것에 대해 경고하지만 프로그래머가 이미 알고 있다면 억제 경고를 사용하여 그 두려운 경고를 꺼질 수 있습니다.

컴파일러가 유형 안전을 보장 할 수 없음을 나타냅니다. "확인되지 않은"경고라는 용어는 오해의 소지가 있습니다. 경고가 어떤 식 으로든 검사되지 않은 것을 의미하지는 않습니다. "확인되지 않은"이라는 용어는 컴파일러와 런타임 시스템에 유형 안전을 보장하는 데 필요한 모든 유형 검사를 수행하기에 충분한 유형 정보가 없다는 사실을 나타냅니다. 이런 의미에서 특정 작업은 "확인되지 않은"것입니다.

"확인되지 않은"경고의 가장 일반적인 출처는 원시 유형의 사용입니다. 원시 유형이 필요한 모든 유형 검사를 수행하기에 충분한 유형 정보를 제공하지 않기 때문에 원시 유형 변수를 통해 객체에 액세스 할 때 "확인되지 않은"경고가 발행됩니다.

예제 (원시 유형과 함께 확인되지 않은 경고) :

TreeSet set = new TreeSet(); 
set.add("abc");        // unchecked warning 
set.remove("abc");
warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.TreeSet 
               set.add("abc");  
                      ^

ADD 메소드가 호출되면 컴파일러는 컬렉션에 문자열 객체를 추가하는 것이 안전한 지 알 수 없습니다. 트리셋이 문자열 S (또는 그 유형)를 포함하는 컬렉션 인 경우 안전합니다. 그러나 원시 유형 트리 셋이 제공 한 유형 정보에서 컴파일러는 알 수 없습니다. 따라서 전화는 잠재적으로 안전하지 않으며 "확인되지 않은"경고가 발행됩니다.

컴파일러가 대상 유형이 매개 변수 유형 또는 유형 매개 변수 인 캐스트를 찾을 때 "확인되지 않은"경고도보고됩니다.

예제 (매개 변수화 된 유형 또는 유형 변수에 대한 캐스트와 함께 확인되지 않은 경고) :

  class Wrapper<T> { 
  private T wrapped ; 
  public Wrapper (T arg) {wrapped = arg;} 
  ... 
  public Wrapper <T> clone() { 
    Wrapper<T> clon = null; 
     try {  
       clon = (Wrapper<T>) super.clone(); // unchecked warning 
     } catch (CloneNotSupportedException e) {  
       throw new InternalError();  
     } 
     try {  
       Class<?> clzz = this.wrapped.getClass(); 
       Method   meth = clzz.getMethod("clone", new Class[0]); 
       Object   dupl = meth.invoke(this.wrapped, new Object[0]); 
       clon.wrapped = (T) dupl; // unchecked warning 
     } catch (Exception e) {} 
     return clon; 
  } 
} 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: Wrapper <T> 
                  clon = ( Wrapper <T>)super.clone();  
                                                ^ 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: T 
                  clon. wrapped = (T)dupl;

런타임시 동적 유형 검사가 관련된 경우 대상 유형이 (콘크리트 또는 경계 와일드 카드) 매개 변수 유형 또는 유형 매개 변수 인 캐스트가 안전하지 않습니다. 런타임에 소스 코드에서 볼 수있는 정확한 정적 유형이 아닌 유형 삭제 만 사용할 수 있습니다. 결과적으로, 캐스트의 런타임 부분은 정확한 정적 유형이 아닌 유형 삭제에 따라 수행됩니다.

이 예에서, 캐스트 to 래퍼는 Super.Clone에서 반환 된 물체가 특정 유형의 멤버가있는 래퍼인지 여부가 아닌 포장지인지 확인합니다. 마찬가지로, 유형 파라미터 T에 대한 캐스트는 런타임에 객체를 입력하기 위해 캐스트되며 아마도 최적화 될 수 있습니다. 유형 삭제로 인해 런타임 시스템은 런타임에서보다 유용한 유형 확인을 수행 할 수 없습니다.

어떤면에서, 소스 코드는 오해의 소지가 있습니다. 왜냐하면 각각의 대상 유형에 대한 캐스트가 수행되며 실제로 캐스트의 동적 부분은 대상 유형의 유형 삭제에 대해서만 검사합니다. "확인되지 않은"경고는 캐스트의 정적과 동적 측면 사이의 이러한 불일치에 대한 프로그래머의 관심을 끌기 위해 발행됩니다.

참조하시기 바랍니다: "확인되지 않은"경고는 무엇입니까?

@SuppressWarnings 주석은 JDK에서 사용 가능한 세 가지 내장 주석 중 하나이며 @override와 함께 추가되고 Java 1.5에서 @deprecated.

@SuppressWarnings는 컴파일러에게 주석이 달린 요소의 지정된 컴파일러 경고 및 해당 요소 내부의 모든 프로그램 요소를 무시하거나 억제하도록 지시합니다. 예를 들어, 클래스에 특정 경고를 억제하기 위해 주석이 달린 경우 해당 클래스 내부의 메소드에서 생성 된 경고도 분리됩니다.

@suppresswarnings 주석의 가장 인기있는 두 가지 예 중 @suppresswarnings ( "Checked") 및 @SuppressWarnings ( "Serial")를 보았을 것입니다. 전자는 점검되지 않은 캐스팅으로 인해 경고를 억제하는 데 사용되는 반면, 이후 경고는 직렬화 가능한 클래스에서 직렬 버전을 추가하는 것을 상기시키는 데 사용됩니다.

더 읽기 : https://javarevisited.blogspot.com/2015/09/what-is-suppresswarnings-annotation-in-java-unchecked-raw-serial.html#ixzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzze

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top