Ответ 1
Это происходит из-за стирания типов, используемого с универсальными типами Java - проверки типов выполняются только во время компиляции для универсальных типов, а затем информация о типах для универсальных элементов стирается, что фактически превращает List<Integer>
в List<Object>
.
Моя IDE предупреждает вас о "непроверенном приведении от Double к T". Но компилятор не может быть уверен, что ваш код ошибочен, поэтому он не выдает ошибку, а только предупреждение.
Затем во время выполнения проверка типа больше не выполняется из-за стирания типа, поэтому код будет выполняться без ошибок, если вы не выполните какую-либо операцию, которая завершится неудачно из-за несовместимого типа времени выполнения. System.out.println()
не является такой операцией.
Если вы измените код печати на
Integer num = numList.get(0);
System.out.println(num);
теперь это будет включать проверку типа во время выполнения и, следовательно, потерпит неудачу:
java.lang.ClassCastException: java.lang.Double нельзя привести к java.lang.Integer