Иногда, когда, глядя через код, я вижу много способов указания аннотация:
@SuppressWarnings("unchecked")
Что это значит?
Иногда Java дженериков просто не'т позволю тебе делать то, что вы хотите, и вы должны сообщить компилятору, что то, что вы'вновь действительно будет иметь права на выполнение.
Я обычно нахожу это боль, когда я'м насмешливый универсальный интерфейс, но есть и другие примеры тоже. Это'ы, как правило, стоит попытаться выработать способ избежать предупреждением, а не подавлять его (параметризованных типов Java часто задаваемые вопросы помогает в этом) но иногда даже если оно ** возможно, она склоняется код из формы настолько, что подавляя предупреждение аккуратнее. Всегда добавить пояснительный комментарий в этом случае!
То же дженериков вопросы и ответы состоит из нескольких разделов по этой теме, начиная с "Что представляет собой "непроверенной" и предупреждение?&и" - это'ы хорошо стоит читать.
Это аннотация для того чтобы подавить предупреждения компилятора о непроверенный родовых операций (без исключений), таких как шины. Это по существу означает, что программист не желаете быть уведомленными о них, которые он уже осознает при составлении конкретного куска кода.
Вы можете прочитать больше на этой конкретной аннотации здесь:
Кроме того, Oracle предоставляет некоторую документацию по использованию аннотации здесь:
Как они выразились,
"Волна 'непроверенной' предупреждение может возникнуть при взаимодействии с legacy кодом, написанным до появления генериков (обсуждали в уроке под названием дженерики).&и"
Это также может означать, что нынешняя система типа Java версия это'т достаточно хорошо для вашего дела. Было несколько в JSR предложения / хаки, чтобы исправить это: тип маркеров, 2упер тип согласия2, класс.литой().
Если вы действительно нуждаетесь в этой борьбе, сузить, насколько возможно (например, Дон'т положить его на сам класс или на длинный способ). Пример:
public List<String> getALegacyListReversed() {
@SuppressWarnings("unchecked") List<String> list =
(List<String>)legacyLibrary.getStringList();
Collections.reverse(list);
return list;
}
В SuppressWarning аннотация используется для подавления предупреждений компилятора для аннотированного элемента. В частности, "непроверено" категория позволяет подавления предупреждений компилятора генерируется в результате неконтролируемой приведения типов.
Просто: Это'с предупреждением, которым компилятор указывает, что он не может гарантировать безопасность типов.
Способ обслуживания СПД например:
@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
Query query = entitymanager.createQuery("SELECT u FROM User u");
return (List<User>)query.getResultList();
}
Если я не'н anotate в @SuppressWarnings (на"непроверенной") смотрите здесь, он будет иметь проблемы с линией, где я хочу вернуть 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);
И Список.о` определяется как.
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 не имеет понятия, что универсальных типов во время выполнения программы, так что это компилируется и работает, как для виртуальной машины Java, это приведение типа 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
В "непроверено" предупреждение говорит программисту, что гипс может вызвать программу, чтобы бросить исключение где-то еще. Подавляя предупреждение с @SuppressWarnings (на"непроверенной", у)
указывает компилятору, что программист считает, что код должен быть безопасным и выиграл'т вызвать неожиданные исключения.
Зачем вы хотите это сделать? Системы типа Java-это'т достаточно хорош, чтобы представлять все возможные схемы использования типа. Иногда вы, возможно, знаете, что гипс является безопасным, но Java не'т предоставить способ сказать так, чтобы скрыть предупреждения, как это, @SupressWarnings (на"непроверенной", У) может быть использован, так, чтобы программист мог сосредоточиться на реальных предупреждений. Например, необязательный.пустой()
возвращает одноэлементный, чтобы избежать выделения пустых опций, что Дон'т сохранить значение.
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>> {}
Затем вы можете проверить его с instanceof перед броском...
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 раньше, чем JDK 5, поэтому каких-либо смесей старые конструкции на новые может привести к некоторым неожиданным результатам.
Компилятор предупреждает программиста о нем, но если программист уже знает, они могут превратить эти страшные предупреждения с помощью SuppressWarnings.
Предупреждение, которым компилятор указывает, что он не может гарантировать безопасность типов. Термин "и снят фильм" предупреждение вводит в заблуждение. Это не значит, что предупреждение будет отмечено в любом случае. Термин "и снят фильм" ссылается на то, что компилятор и система времени выполнения не хватает информации для выполнения проверки типа, которые будут необходимы для обеспечения безопасности типов. В этом смысле, определенные операции и"непроверенной " и;.
Наиболее распространенным источником на "непроверенной" и предупреждения является использование сырого типа. на "непроверенной" и предупреждения, когда доступ к объекту осуществляется через переменную типа сырья, так как сырье не дают достаточно информации для выполнения всех необходимых проверок типа.
Пример (непроверенных предупреждение в сочетании с сырыми типов):
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 вызывается компилятор не знает, является ли это безопасно, чтобы добавить строковый объект в коллекцию. Если TreeSet-коллекция, которая содержит строку s (или его супертип), тогда это будет безопасно. Но от информации о типе предоставляемых сырой тип TreeSet компилятор не может сказать. Отсюда призыв является потенциально небезопасным и собой "непроверенной" и предупреждение.
на "непроверенной" и предупреждения также сообщил, когда компилятор находит разыграть целевую чей тип является параметризованным типом или типом параметра.
Пример (предупреждение непроверенное в сочетании с броском на параметризованный тип или тип переменной):
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;
Литые цель которого тип либо (конкретных или ограниченных по шаблону) параметризованный тип или параметр типа является небезопасным, если используется динамическая проверка типа во время выполнения, является. Во время выполнения, только стирания типа можно, но не точный статический тип, который виден в исходном коде. В результате выполнения части осуществляется на основе стирания типа, а не о точном статического типа.
В примере приведен к обертке в<Т> хотел бы проверить, является ли объект, возвращенный из супер.клон-это фантик , не является ли это оболочка с определенным типом членов. Аналогично, слепки с параметром типа T приводятся к тип объекта во время выполнения, и, наверное, вообще оптимизировать его. Из-за стирания типа, система времени выполнения может выполнять более полезную проверки типов во время выполнения.
Таким образом, исходный код может ввести в заблуждение, поскольку предполагает, что приведение к соответствующему приемнику типа выполняется, в то время как динамическая часть литой проверяет только против стирания типа в целевой тип. В "непроверенной" и предупреждение, чтобы привлечь программиста's внимание на это несоответствие между статической и динамической аспект бросания.
Пожалуйста, ознакомьтесь: что представляет собой "непроверенной" и предупреждение?
@SuppressWarnings аннотация является одним из трех встроенных аннотаций, доступных в JDK и добавились @переопределить и @deprecated в Java 1.5.
@SuppressWarnings указать компилятору игнорировать или подавлять, указанное предупреждение компилятора в аннотированный элемент и все элементы программы внутри этого элемента. Например, если класс аннотируется, чтобы подавить предупреждения, то предупреждение генерируется в методе внутри класса будут разделены.
Вы, возможно, видели @SuppressWarnings (на"непроверенной", У) и @SuppressWarnings (на"серийный", У), два из самых популярных примеров аннотацию @SuppressWarnings. Бывший используется для подавления предупреждений, генерируемых в результате бесконтрольного кастинг, а позже предупреждение используется, чтобы напомнить о добавлении SerialVersionUID в сериализуемый класс.