Это изначально определяется 18.1.3:
Когда начинается вывод, связанное множество, как правило, генерируется из списка деклараций параметров типа P1, ..., Pp
и связанных с ними вывода переменных α1, ..., αp
. Такое связанное множество строится следующим образом. Для каждого л (1 ≤ L ≤ р):
Если Pl
не имеет TypeBound
, связанного αl <: Object
появляется в наборе.
В противном случае, для каждого типа T
, ограниченной &
в TypeBound
, связанный αl <: T[P1:=α1, ..., Pp:=αp]
появляется в наборе; [...].
В конце вывода, связанный набор получает «решен» с выведенным типом. Без какого-либо дополнительного контекста связанный набор будет состоять только из начальных границ, основанных на объявлении параметра типа.
связанный с формой, как αl <: Object
означает αl
(переменный логический вывод) является Object
или подтип Object
. Эта граница разрешена к Object
.
Так что в вашем случае, да, Object
выведено.
Если мы объявили тип связанного:
private <T extends SomeType> void parameterizedMethod()
тогда SomeType
будет выведенный.
В данном случае никакого наложения не происходит (стирание). Вот почему это «непроверено». Литая происходит только тогда, когда объект подвергается воздействию вследствие например .:
<T> T parameterizedMethodWithAResult()
{
return (T) new String();
}
// the cast happens out here
Integer i = parameterizedMethodWithAResult();
// parameterizedMethodWithAResult returns Object actually,
// and we are implicitly doing this:
Integer i = (Integer) parameterizedMethodWithAResult();
ли какие-либо ограничения, которые размещены на какой тип объекта может быть помещен в список?
Семантически (время компиляции), да. И обратите внимание, что ограничение определяется за пределами метод. Внутри метод, мы не знаем, какое это ограничение на самом деле. Поэтому мы не должны ставить String
в List<T>
. Мы не знаем, что такое T
.
Практически (время работы), нет. Это всего лишь List
, и нет проверочного списка. parameterizedMethod
не вызывает исключения ... но это справедливо только для такого рода изолированного примера. Такой код может привести к проблемам.
спасибо. То, что я с тех пор нашел, также очень интересно, так это то, что компилятор заставляет меня сохранять приведение в (T) при добавлении новой строки в список. Поэтому, хотя мы не знаем, что такое T (хотя, как вы указываете, это объект), я вынужден использовать все, что я добавляю в список, к (T). – swingMan
Правильно, у нас есть некоторое представление о том, что такое 'T'", но мы точно не знаем. Компилятор использует это неизвестное. – Radiodef