Использование var
может привести к переменной, имеющей неназначаемый тип . Например, смотрит на возвращаемый тип выражения, которое может быть String
или Integer
:
jshell> /set feedback verbose
jshell> var x = true ? "a" : 1
x ==> "a"
| created variable x : Serializable&Comparable<? extends Serializable&Comparable<?>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc
Когда jshell
оценивает ваш фрагмент кода, если это В этом случае он оборачивает его в блок кода , чтобы он мог записать этот тип для дальнейшего использования. Фрагмент упаковки включает общий параметр типа c, называемый Z
:
// private static <Z> Z do_itAux() {
// wtype x_ = y;
// @SuppressWarnings("unchecked")
// Z x__ = (Z) x_;
// return x__;
Имя этого параметра просачивается в оцениваемый блок кода, что означает, что имя класса затеняется параметром типа. Это делает Z
особым случаем - подойдут и другие примеры, состоящие из одного символа.