Предупреждение, с помощью которого компилятор указывает, что он не может обеспечить безопасность типов.
Термин «непроверенное» предупреждение вводит в заблуждение. Это не значит, что предупреждение никак не проверяется. Термин «непроверенный» относится к тому факту, что компилятор и система времени выполнения не имеют достаточно информации о типе, чтобы выполнить все проверки типов, которые были бы необходимы для обеспечения безопасности типов. В этом смысле некоторые операции «не проверяются».
Наиболее распространенным источником «непроверенных» предупреждений является использование необработанных типов. «непроверенные» предупреждения выдаются при доступе к объекту через переменную необработанного типа, поскольку необработанный тип не предоставляет достаточно информации о типе для выполнения всех необходимых проверок типа.
Пример (непроверенного предупреждения в сочетании с необработанными типами):
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 (или ее супертип), то это будет безопасно. Но из информации о типе, предоставленной необработанным типом 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;
Приведение, целевой тип которого является параметризованным типом (конкретным или ограниченным подстановочным знаком) или параметром типа, является небезопасным, если включена динамическая проверка типа во время выполнения. Во время выполнения доступно только стирание типа, а не точный статический тип, видимый в исходном коде. В результате часть выполнения приведения выполняется на основе стирания типа, а не на точном статическом типе.
В этом примере приведение к Wrapper проверит, является ли объект, возвращаемый из super.clone, оболочкой, а не оболочкой с элементами определенного типа. Аналогично, приведение к параметру типа T приведено к типу Object во время выполнения и, вероятно, полностью оптимизировано. Из-за стирания типа система времени выполнения не может выполнять более полезные проверки типов во время выполнения.
В некотором смысле, исходный код вводит в заблуждение, поскольку он предполагает, что приведение к соответствующему целевому типу выполняется, в то время как на самом деле динамическая часть приведения проверяет только удаление типа целевого типа. «Непроверенное» предупреждение выдается, чтобы привлечь внимание программиста к этому несоответствию между статическим и динамическим аспектом приведения.
Пожалуйста, обратитесь: Что такое "непроверенное" предупреждение?