Является ли приведение из подстановочного знака к определенному универсальному параметризованному типу примером преобразования захвата в Java?

Для следующего кода, который компилируется без ошибок и выполняется без исключений:

public class Main
{
    public static void main(String[] args) {
        List<?> unbounded = new ArrayList<String>();

        List<String> strList = (List<String>) unbounded;    // Is this a capture conversion?
        List<Integer> intList = (List<Integer>) unbounded;  // Is this a capture conversion?
    }
}

Является ли приведенный выше фрагмент кода примером работы Capture Conversion в Java?

Согласно JLS,

Существует преобразование захвата из параметризованного типа G‹T1,...,Tn› (§4.5) в параметризованный тип G‹S1,...,Sn›, где для 1 ≤ i ≤ n:

  • Если Ti является аргументом типа подстановки (§4.5.1) формы ?, то Si является переменной нового типа, верхняя граница которой равна Ui[A1:=S1,...,An:=Sn], а нижняя граница равна нулевой тип (§4.1).

Я понимаю приведенное выше утверждение следующим образом: если подстановочный знак имеет форму '?', существует преобразование захвата из G‹T› в G‹S›, пока 'S' находится в пределах Object< /strong>(верхняя граница) и null(нижняя граница).

То есть, например, в приведенном выше фрагменте кода преобразование «List‹?›» в «List‹Integer›» будет преобразованием с захватом, которое не вызовет никаких исключений во время выполнения (что также указано в JLS)? Это правильно? Кроме того, правильно ли говорить, что он не генерирует исключение времени выполнения из-за стирания типа?

Если это так, не подорвет ли преобразование захвата безопасность типов? Согласно JLS, преобразование захвата введено, чтобы сделать подстановочные знаки более полезными, не подрывая систему типов?


person Hill Tezk    schedule 09.06.2021    source источник
comment
Ваш код не содержит преобразование захвата, но непроверенные приведения. Проверьте JLS для реальных примеров, в частности, для примера метода reverse. В двух словах преобразование захвата означает, что вы можете рассматривать список неизвестного типа List<?> как список определенного (но все еще неизвестного) типа List<T>. Почему это полезно (и почему это безопасно) довольно хорошо объясняется в комментарии JLS.   -  person Joachim Sauer    schedule 09.06.2021
comment
@JoachimSauer Понятно. Я также вижу, как компилятор выдает предупреждение о непроверенном преобразовании. В этом случае я обнаружил, что не совсем понимаю, что такое преобразование захвата. Как я читал в JLS (как указано в описании моего вопроса), кажется, что JLS описывает преобразование захвата как преобразование формы подстановочного знака в параметризованный тип. Не могли бы вы указать, что я неправильно понимаю в разделе, который я цитировал JLS в описании вопроса?   -  person Hill Tezk    schedule 09.06.2021
comment
Я также прочитал этот пост о преобразовании захвата: Что такое преобразование захвата в Java и может ли кто-нибудь привести примеры?. В примере, приведенном JLS, я увидел, что преобразование захвата происходит при передаче универсального подстановочного знака в метод с аргументом вида List‹T›. Разве это не похоже на пример кода, который я привел? Оба преобразуют подстановочный знак в параметризованный тип?   -  person Hill Tezk    schedule 09.06.2021
comment
Мне кажется, что между моим кодом и примером в JLS есть разница, но я не мог объяснить разницу и то, что на самом деле происходит за сценой. Было бы лучше, если бы кто-нибудь мог помочь мне действительно понять преобразование захвата или указать мне еще несколько ресурсов.   -  person Hill Tezk    schedule 09.06.2021
comment
Преобразование захвата происходит автоматически и не является явным приведением. Я не могу привести лучший пример, чем тот, на который вы ссылаетесь.   -  person Joachim Sauer    schedule 09.06.2021