В общем, вы не можете разыграть Object[][]
в Optional[][]
. Вы получите ClassCastException
во время выполнения. Массив должен быть создан как Optional[][]
, а не как Object[][]
. Но дженерики обычно являются предпочтительными необработанными типами.
Дело не в том, что вы никогда не сможете создавать массивы генериков. Вы должны сделать это косвенно. Как правило, способ сделать это состоит в том, чтобы создать массивы обобщенных шаблонов с неограниченным подстановочным знаком, а затем выполнить непроверенное приведение - как вы сделали - к нужному типу:
@SuppressWarnings("unchecked")
Optional<Integer>[][] arr = (Optional<Integer>[][]) new Optional<?>[5][5];
Вышеприведенное относится к созданию любых массивов некоторого определенного универсального типа. В этом случае вы можете рассмотреть возможность использования OptionalInt
вместо Optional<Integer>
. Это позволяет обойти любые опасения относительно массивов генериков.
(В целом, я несколько подозрительно отношусь к идее создания массивов или коллекций Optionals любого вкуса. Это просто кажется странным занятием. Альтернативы часто бывают лучше. Но в некоторых случаях это может быть оправдано. В любом случае. вопрос о том, подходит ли массив Optionals для какой-либо проблемы, которую вы пытаетесь решить, - это отдельный вопрос.)