때로는 코드를 살펴볼 때 많은 메소드가 주석을 지정하는 것을 볼 수 있습니다.
@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);
ClassCastException
Java 컴파일러가 암시 적 캐스트를 삽입했기 때문에 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;
}