Ответ 1
Кажется, вы не единственное, кто смутил это определение, в этом сообщении в блоге есть объяснение: http://mbravenboer.blogspot.com/2008/12/why-jvm-spec-defines-checkcast-for.html
Оказывается, это действительно "невозможный" случай. Причина, по которой этот элемент находится в потому что checkcast рекурсивно определяется для массивов:
- Если S - класс, представляющий тип массива SC [], то есть массив компонентов типа SC, тогда:
- ...
- Если T - тип массива TC [], то есть массив компонентов типа TC, то одно из следующего должно быть истинным:
- ...
- TC и SC являются ссылочными типами, а тип SC можно отнести к TC путем рекурсивного применения этих правил.
Итак, если у вас есть объект типа List [], который передается в Collection [], тогда правила для checkcast будут рекурсивно вызываться для типов S = List и T = Collection. Обратите внимание, что List является интерфейсом, но во время выполнения объект может иметь тип List []. Если вы не подтвердили это с помощью поддерживающих JVM Spec, но, насколько я вижу, это единственная причина, по которой существует правило для типов интерфейсов.