Я не думаю, что система типов позволяет вам делать именно то, что вы хотите, и получать безопасность типов во время компиляции.
Одним из приближений является следующее:
List<JComponent> componentList = new ArrayList<>();
List<MyInterface> myInterfaceList = (List) componentList;
Если вы не возражаете против предупреждения во время компиляции, у вас теперь есть два представления в одном и том же списке: одно показывает содержимое как JComponent
, а другое как MyInterface
.
Вы можете добавить объекты в любое представление, а затем прочитать их из представления, предоставляющего правильный тип для контекста.
Естественно, когда вы добавляете объект, компилятор не проверяет, что вставленный объект подклассов JComponent
и MyInterface
. Это ваша ответственность.
Если вы хотите больше безопасности типа (во время выполнения), вы можете пойти по этому пути:
List rawList = new ArrayList();
List checkedList = Collections.checkedList(rawList, JComponent.class);
List doublyCheckedList = Collections.checkedList(checkedList, MyInterface.class);
List<JComponent> componentList = doublyCheckedList;
List<MyInterface> myInterfaceList = doublyCheckedList;
Если вы вставляете только в doublyCheckedList
, во время выполнения список проверит, что вставленные объекты подклассы JComponent
и MyInterface
. При чтении вы можете использовать два представления, как в моем предыдущем фрагменте.