Как можно добавить двойник в ArrayList из Integer? (Джава)

Я пытаюсь понять, как можно иметь значение Double в ArrayList из Integer. numList - это ArrayList из Integer, а значение из него - Double.

Это код:

package bounded.wildcards;

import java.util.ArrayList;
import java.util.List;

public class GenericsDemo {

    public static void main(String[] args) {
        // Invariance Workaround
        List<Integer> numList = new ArrayList<>();
        GenericsDemo.invarianceWorkaround(numList);
        System.out.println(numList);
    }

    static <T extends Number> void invarianceWorkaround(List<T> list) {

        T element = (T) new Double(23.3);  
        list.add(element);
    }

}

Это скомпилирует и запустит без ошибок.

Ответ 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

Ответ 2

Вы должны округлить в два раза до целого числа

Integer i = Double.intValue();
int i = (int) double;