Это происходит из-за стирания типа , используемого с универсальными типами 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