Можно ли опускать бриллиантовый оператор в последних java версиях (8+)? - PullRequest
1 голос
/ 04 апреля 2020

С Java 7 мы могли бы использовать оператор алмаза:

List<String> list = new ArrayList<>();

Теперь я вижу, что в некоторых недавних кодах люди бросают оператор алмаза:

List<String> list = new ArrayList();

Это новая функция, добавленная в более поздние версии java (Java 8+) для удаления оператора бриллианта? Или они просто полагаются на необработанный старый тип ArrayList (который просто работает по причинам обратной совместимости, и его следует избегать)?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

По моему мнению, вы не должны опускать его, если это возможно, но это работает.

Пропускать это означает использование необработанного типа. Во время выполнения это не имеет значения, так как общие значения стираются во время компиляции, но вы можете получить предупреждения компилятора и / или предупреждения / ошибки / ошибки linter, потому что тип <Object> не подходит.

Если вы не знаете тип или не хотите его указывать, вы все равно можете использовать <? extends Object>.

Проблема в том, что если вы хотите сделать что-то вроде этого:

List<String>[] data=new List<String>[16];

Это не работает потому что вы не можете легко создавать экземпляры массивов обобщений.

В этом случае я бы исключил вмешательство типа и игнорировал (подавлял) (возможные) предупреждения компилятора.

@SuppressWarnings("unchecked")
List<String>[] data=new List[16];

Но, как @ vbezhenar упоминается в комментариях:

Лучше избегать использования массивов обобщенных c типов, просто используйте для этого что-то вроде List<List<String>>.

Как правило, с List легче работать, чем с массивами, особенно если вы используете дженерики.

1 голос
/ 04 апреля 2020

Правильный синтаксис (для того, что вы хотите):

List<String> l1=new ArrayList<>();

Пропуск оператора diamond означает неквалифицированный список, который (под капотом, конечно, такой же, но) даст вам предупреждение компилятора.

Использование его безоговорочно работает против системы проверки типов во время компиляции и не соответствует переменной, которую вы объявляете с помощью оператора diamond, но оно будет компилироваться (и работать, если вы все сделаете правильно ). Вот почему вы получите предупреждение.

...