Java에서 Suppress Warnings("체크 해제")란 무엇입니까?
코드를 살펴볼 때 주석을 지정하는 방법이 많이 있습니다.
@SuppressWarnings("unchecked")
이것은 무엇을 의미합니까?
때때로 Java 제네릭스는 당신이 원하는 것을 할 수 없게 하고, 당신은 컴파일러에게 당신이 하고 있는 일이 실행 시 정말로 합법적일 것이라고 효과적으로 말할 필요가 있다.
일반적인 인터페이스를 조롱할 때는 보통 이 점이 문제가 되지만, 다른 예도 있습니다.보통 경고를 억제하기보다는 회피하는 방법을 강구하는 것이 좋습니다(Java Generics FAQ는 여기서 도움이 됩니다). 하지만 때로는 코드를 너무 구부려서 경고를 억제하는 것이 더 깔끔할 수도 있습니다.그럴 때는 항상 설명을 추가하세요!
동일한 일반 FAQ에는 "체크되지 않은 경고란?"으로 시작하는 이 항목에 대한 몇 가지 섹션이 있습니다. 읽어볼 만한 가치가 있습니다.
캐스트와 같이 체크되지 않은 일반 작업에 대한 경고 컴파일(예외 아님)을 억제하기 위한 주석입니다.이는 기본적으로 프로그래머가 특정 코드 비트를 컴파일할 때 이미 알고 있는 이러한 사항에 대해 통지받기를 원하지 않았음을 의미합니다.
이 특정 주석에 대한 자세한 내용은 여기를 참조하십시오.
또한 Oracle은 주석 사용에 대한 몇 가지 튜토리얼 문서를 제공합니다.
그들의 표현대로라면
'체크되지 않은' 경고는 제네릭스가 등장하기 전에 작성된 레거시 코드와 인터페이스할 때 발생할 수 있습니다(제너릭스의 레슨에서 설명).
또한 현재의 Java 타입의 시스템 버전이 고객님의 경우에 적합하지 않을 수도 있습니다.이를 해결하기 위한 JSR 제안/해킹이 몇 가지 있었습니다.tokens, Super Type Tokens, Class.cast()를 입력합니다.
이 억제가 정말로 필요한 경우는, 가능한 한 좁혀 주세요(예를 들면, 클래스 자체나 긴 방법에는 넣지 말아 주세요).예:
public List<String> getALegacyListReversed() {
@SuppressWarnings("unchecked") List<String> list =
(List<String>)legacyLibrary.getStringList();
Collections.reverse(list);
return list;
}
간단히: 컴파일러가 타입의 안전을 보장할 수 없음을 나타내는 경고입니다.
JPA 서비스 방법은 다음과 같습니다.
@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
Query query = entitymanager.createQuery("SELECT u FROM User u");
return (List<User>)query.getResultList();
}
여기서 @Suppress Warnings("체크 해제")를 표시하지 않으면 회선에 문제가 발생하여 결과 목록을 반환할 수 없습니다.
숏컷 타입 세이프티 수단: 프로그램이 오류나 경고 없이 컴파일되어 실행 시 예기치 않은 ClassCastException이 발생하지 않으면 타입 세이프로 간주됩니다.
http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html을 기반으로 구축
SuppressWarning 주석은 주석이 달린 요소의 컴파일러 경고를 억제하기 위해 사용됩니다.구체적으로는unchecked
castscategory의 가 꺼진 를 억제할 수 있습니다.
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;
인지 알 수 Virtual Machine의 Machine에 입니다. 자바 가상 머신List
입니다).type(확인할 수 있는 것은 이것뿐입니다).
하지만 이제 이 줄을 추가하세요.
Integer hello = actualList.get(0);
JVM은 치 못한 JVM을 .ClassCastException
Java ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」
java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.lang.Integer
안unchecked
warning은 프로그램 진행자가 다른 곳에서 예외를 발생시킬 수 있음을 프로그래머에게 알려줍니다. 의한 @SuppressWarnings("unchecked")
는 프로그래머가 코드가 안전하며 예기치 않은 예외를 일으키지 않는다고 컴파일러에게 말합니다.
왜그 하고 ?고 ?? ?? ??자바 타입 시스템은 가능한 모든 타입의 사용 패턴을 나타내기에는 충분하지 않습니다.알 수 , 하지 않습니다., 자바는 경고를 숨깁니다.@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에서는 지원되지 않는 새로운 프로그래밍 구성이기 때문에 이전 구성과 새 구성 요소가 혼합되면 예기치 않은 결과가 발생할 수 있습니다.
컴파일러는 프로그래머에게 경고하지만 프로그래머가 이미 알고 있다면 SuppressWarnings를 사용하여 해당 경고를 해제할 수 있습니다.
컴파일러가 타입의 안전을 보장할 수 없음을 나타내는 경고입니다.체크되지 않은 경고라는 용어는 오해의 소지가 있습니다.어떤 식으로든 경고가 선택 취소된 것은 아닙니다."체크 해제"라는 용어는 컴파일러와 런타임 시스템에 충분한 유형 정보가 없기 때문에 유형의 안전성을 확보하기 위해 필요한 모든 유형 검사를 수행할 수 없음을 의미합니다.이런 의미에서 특정 작업은 "체크 해제"됩니다.
체크되지 않은 경고의 가장 일반적인 원인은 원시 유형을 사용하는 것입니다.raw 유형은 필요한 모든 유형 검사를 수행하기에 충분한 유형 정보를 제공하지 않기 때문에 raw 유형 변수를 통해 개체에 액세스할 때 경고가 발생합니다.
예(raw 유형과 함께 체크되지 않은 경고의 경우):
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 메서드가 호출되면 컴파일러는 String 개체를 컬렉션에 추가하는 것이 안전한지 여부를 알 수 없습니다.TreeSet이 String s(또는 그 슈퍼타입)를 포함하는 컬렉션인 경우 안전합니다.그러나 raw type TreeSet에서 제공되는 유형 정보에서는 컴파일러가 알 수 없습니다.따라서 콜은 안전하지 않을 수 있으며 "체크되지 않은" 경고가 발생합니다.
또한 컴파일러가 대상 유형이 매개 변수화된 유형 또는 유형 매개 변수인 캐스트를 발견했을 때도 "cast" 경고가 보고됩니다.
예(파라미터화된 유형 또는 유형 변수에 대한 캐스트와 함께 선택되지 않은 경고의 경우):
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;
실행 시 동적 유형 검사가 관련된 경우 대상 유형이 매개 변수 유형(구체 또는 제한 와일드카드) 또는 유형 매개 변수인 캐스트는 안전하지 않습니다.런타임에는 소스 코드에 표시되는 정확한 정적 유형이 아닌 유형 삭제만 사용할 수 있습니다.그 결과, 정확한 정적 유형이 아닌 유형 삭제에 근거해 캐스트의 런타임 부분이 실행된다.
이 예에서 Wrapper에 대한 캐스트는 super.clone에서 반환된 객체가 Wrapper인지 아닌지를 확인합니다.마찬가지로 타입 파라미터 T에 대한 캐스트는 런타임에 오브젝트 타입으로 캐스팅되어 아마 완전히 최적화되어 있을 것입니다.유형 삭제로 인해 런타임 시스템은 런타임에 더 유용한 유형 검사를 수행할 수 없습니다.
어떤 면에서 소스 코드는 오해의 소지가 있는데, 이는 각 타깃 타입에 대한 캐스팅이 이루어졌음을 시사하는 반면, 실제로는 타깃 타입의 타입 삭제에 대해서만 캐스트의 동적 부분이 체크하기 때문이다."체크되지 않은" 경고는 캐스트의 정적 측면과 동적 측면 사이의 불일치에 대한 프로그래머의 주의를 끌기 위해 발행됩니다.
다음을 참조해 주세요.체크되지 않은 경고란 무엇입니까?
@Suppress Warnings 주석은 JDK에서 사용할 수 있는 3가지 기본 주석 중 하나로 Java 1.5에서 @Override 및 @Deprecated와 함께 추가됩니다.
@SuppressWarnings는 컴파일러에 대해 주석 요소가 지정된 컴파일러 경고 및 해당 요소 내의 모든 프로그램 요소를 무시하거나 억제하도록 지시합니다.예를 들어 클래스에 주석을 달아 특정 경고를 억제하는 경우 해당 클래스 내의 메서드에서 생성된 경고도 분리됩니다.
@Suppress Warnings 주석의 가장 일반적인 두 가지 예인 @Suppress Warnings("체크되지 않음")와 @Suppress Warnings("시리얼")을 보신 적이 있을 것입니다.전자는 체크되지 않은 캐스팅으로 인해 생성되는 경고를 억제하는 데 사용되며, 후자의 경고는 SerialVersion 추가에 대한 알림에 사용됩니다.Serialable 클래스의 UID.
상세내용 : https://javarevisited.blogspot.com/2015/09/what-is-suppresswarnings-annotation-in-java-unchecked-raw-serial.html#ixzz5rqQaOLUa
언급URL : https://stackoverflow.com/questions/1129795/what-is-suppresswarnings-unchecked-in-java
'programing' 카테고리의 다른 글
MySQL PhpMyAdmin - 인식할 수 없는 키워드 CONCAT (0) | 2022.11.06 |
---|---|
Panda 시리즈 또는 인덱스를 NumPy 배열로 변환하려면 어떻게 해야 합니까? (0) | 2022.11.06 |
특정 색인 뒤에 있는 목록에서 모든 요소 제거 (0) | 2022.11.06 |
Linux에서 현재 사용되는 MySQL 구성 파일의 위치를 확인하는 방법 (0) | 2022.11.06 |
SQL - 배수 값 필드에서 선택 (0) | 2022.11.06 |