Объекты
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__
явно отклоняет форматированные строки, чтобы избежать неявных преобразований строк, особенно потому, что инструкции форматирования специфичны по типу.
Это предупреждение там, потому что Java на самом деле не хранит информацию типа во времени выполнения в объекте, который использует дженерики. Таким образом, если object
будет на самом деле List<String>
, не будет никакого ClassCastException
во времени выполнения кроме того, пока к объекту не получат доступ из списка, который не соответствует универсальному типу, определенному в переменной.
Это может вызвать дальнейшие сложности, если объекты добавляются к списку с этой неправильной универсальной информацией о типе. Любой код, все еще содержащий ссылку на список, но с корректной универсальной информацией о типе, будет теперь иметь непоследовательный список.
Для удаления предупреждения попробуйте:
List<?> list = (List<?>) object;
Однако примечание, что Вы не будете в состоянии использовать определенные методы те, которые добавляют, потому что компилятор не знает, пытаетесь ли Вы добавить объект неправильного типа. Вышеупомянутое будет работать в большом количестве ситуаций, но если необходимо использовать, добавляют, или некоторый столь же ограниченный метод, необходимо будет просто перенести желтое подчеркивание в Eclipse (или SuppressWarning
аннотация).