Как упоминалось в других ответах, тип возвращаемого значения выводится компилятором из целевого типа переменной.Немного подробнее о том, что происходит за сценой.
Если проверить байт-код класса, фактический тип возврата метода getFirst()
равен Object
.
// signature <T:Ljava/lang/Object;>(Ljava/util/List<Ljava/lang/Object;>;)TT;
private getFirst(Ljava/util/List;)Ljava/lang/Object;
Atво время выполнения JVM проверяет фактический тип объекта, возвращенного из getFirst()
, и выдает ClassCastException, если он отличается.
INVOKESPECIAL TestGenericMethod.getFirst (Ljava/util/List;)Ljava/lang/Object;
CHECKCAST java/lang/Integer