Как можно добавить двойной в ArrayList из Integer?(Джава) - PullRequest
16 голосов
/ 28 марта 2019

Я пытаюсь понять, как можно получить значение 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 Ответ

21 голосов
/ 28 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...