Каково значение предупреждения безопасности типов в определенных бросках дженериков Java?

Объекты

bytes не имеют собственного метода __format__, поэтому используется значение по умолчанию от object:

>>> bytes.__format__ is object.__format__
True
>>> '{:20}'.format(object())
Traceback (most recent call last):
  File "", line 1, in 
TypeError: non-empty format string passed to object.__format__

Это просто означает, что вы не можете использовать ничего, кроме прямого up, неформатированное неравномерное форматирование на них. Явно конвертируем в строковый объект (как вы это делали, расшифровывая bytes до str), чтобы получить поддержку спецификации формата .

Вы можете сделать преобразование явным с помощью кнопки !s:

>>> '{!s:20s}'.format(b"Hi")
"b'Hi'               "
>>> '{!s:20s}'.format(object())
''

object.__format__ явно отклоняет форматированные строки, чтобы избежать неявных преобразований строк, особенно потому, что инструкции форматирования специфичны по типу.

68
задан rgettman 17 April 2019 в 19:47
поделиться

1 ответ

Это предупреждение там, потому что Java на самом деле не хранит информацию типа во времени выполнения в объекте, который использует дженерики. Таким образом, если object будет на самом деле List<String>, не будет никакого ClassCastException во времени выполнения кроме того, пока к объекту не получат доступ из списка, который не соответствует универсальному типу, определенному в переменной.

Это может вызвать дальнейшие сложности, если объекты добавляются к списку с этой неправильной универсальной информацией о типе. Любой код, все еще содержащий ссылку на список, но с корректной универсальной информацией о типе, будет теперь иметь непоследовательный список.

Для удаления предупреждения попробуйте:

List<?> list = (List<?>) object;

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

50
ответ дан Insane Skull 24 November 2019 в 14:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: