Если у вас есть необработанный тип на Java, вы можете смело назначить/применить его к тому же типу с неограниченным подстановочным знаком. Например, List можно безопасно отнести к List<?>, который удаляет его необработанную природу и позволяет использовать его в безопасном (с типом) способом 1.
С другой стороны, Java не позволяет выставлять из самого List с параметром raw, например List<Optional>, в список одного и того же типа с неограниченным шаблоном, например List<Optional<?>>.
Вы все еще можете сделать это, сбросив весь исходный List и снова выполнить резервное копирование (неявно через назначение):
List<Optional> rawOptionalList = null;
List<Optional<?>> wildcardOptionalList = (List)rawOptionalList;
Конечно, это вызывает предупреждение о непроверенном преобразовании (от List до List<Optional<?>>).
Мне кажется, что это преобразование гарантировано безопасно: не List<Optional<?>> так же безопасно, как List<Optional> таким же образом, что безопасное литиевание Optional в Optional<?>?
1... но вы никогда не сможете добавить что-либо в этот список, поскольку ничто не будет соответствовать захвату ? для метода add(?). Это цена, которую вы платите за безопасность.