Ошибка JShell "неожиданный тип" при использовании указанного c имени класса - PullRequest
14 голосов
/ 30 мая 2020

Я просто играл с JShell, и кажется, что определение class Z{}, а затем определение var z = new Z() не работает. Но использование разных имен классов, таких как class X и class A, действительно работает.

Наверняка мне не хватает чего-то очевидного ...?

|  Welcome to JShell -- Version 14.0.1
|  For an introduction type: /help intro

jshell> class X{}
|  created class X

jshell> class Z{}
|  created class Z

jshell> var x = new X()
x ==> X@26a1ab54
|  created variable x : X

jshell> var z = new Z()
|  Error:
|  unexpected type
|    required: class
|    found:    type parameter Z
|  var z = new Z();
|              ^

jshell> class A{}
|  created class A

jshell> var a = new A()
a ==> A@2ef1e4fa
|  created variable a : A

1 Ответ

8 голосов
/ 31 мая 2020

Использование 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 особым случаем - подойдут и другие примеры, состоящие из одного символа.

...