Для следующего кода, который компилируется без ошибок и выполняется без исключений:
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, преобразование захвата введено, чтобы сделать подстановочные знаки более полезными, не подрывая систему типов?
reverse
. В двух словах преобразование захвата означает, что вы можете рассматривать список неизвестного типаList<?>
как список определенного (но все еще неизвестного) типаList<T>
. Почему это полезно (и почему это безопасно) довольно хорошо объясняется в комментарии JLS. - person Joachim Sauer   schedule 09.06.2021