Это не имеет никакого отношения к параметру типа. Это работает так:
List<String> list = null;
Connection c = (Connection) list;
Это возможно потому, что List
является тип интерфейса. Ссылка на список может содержать объект, который реализует интерфейс List
, и также также a Connection
(что бы это ни было, класс или интерфейс), и для чего оно действует.
Таким образом, поскольку литье могло работы, это позволяет компилятор. Он будет отвергать только слепки, которые теоретически невозможно, то есть, которые включают конкретные типы в отдельных иерархии наследования:
JComponent c = null;
ArrayList l = (ArrayList) c;
Вы можете посмотреть точные правила для того, что виды забросов законны во время компиляции в Java Language Specification - это о 30 линий гуманной языковой адвокации.
+1 - Но ... * «Это будет только отклонять броски, которые теоретически невозможны ...» *, основанные исключительно на объявленных типах. Например, если список был инициализирован окончательным классом «List», который не реализовал или не расширил «Connection», компилятор * still * должен разрешить это. –