У меня есть следующий вопрос относительно приведенного ниже кода:
public class GenericBridgeMethods <T> {
public static void main(String[] args) {
List obj = new ArrayList<Integer>();
List <?> l1 = (List<?>) obj; // clause 1
GenericBridgeMethods <?> g1 = (GenericBridgeMethods<?>) obj; // clause 2
}
}
a. Пункт 1, конечно, не дает предупреждения о непроверенном приведении
b.Пункт 2 также не выдавал предупреждения о неконтролируемом приведении
. Я заметил, что приведение необработанного типа (obj) к ЛЮБОМУ реифицируемому типу (например, GenericBridgeMethods или GenericBridgeMethods >) Не дает предупреждения о непроверенном приведении. Если вы запустите этот код, в пункте 2 возникнет ошибка времени выполнения.
Разве компилятор не должен выдавать предупреждение в пункте 2
РЕДАКТИРОВАТЬ 1:
ArrayList a1 = new ArrayList<Integer>(); // clause 3
Number n1 = (Number)a1; // clause 4 ERROR
Comparable c1 = (Comparable)a1; // clause 5
List l1 = new ArrayList<Integer>(); // clause 6
Number n2 = (Number)l1; // clause 7
Comparable c2 = (Comparable)l1; // clause 8
Кто-нибудь может объяснить, почему только в пункте 4 есть ошибка?