Будет ли он скомпилирован в
Нет, приведение не будет вставлено, если предел равен Object
, потому что приведение к Object
всегда выполняется успешно.
Если переменная типа ограничена, например, T extends Number
, то будет вставлена инструкция checkcast
, чтобы o
было Number
, что эквивалентно (Number) o
.
. Вы можете заметить, чтокомпилятор генерирует непроверенное предупреждение в этой строке.Непроверенное предупреждение означает, что компилятор не может вставить байт-код, чтобы гарантировать, что o
является, в частности, экземпляром T
.
Стоит также указать, что переменная типа является избыточной.Вы можете использовать следующее, и оно будет эквивалентно:
void call(List<?> list, Object o) {
fun(o);
}
Приведение не требуется, поскольку fun
должен быть в состоянии принять любой Object
в любом случае.