Может ли член класса java не иметь полностью определенного имени, кроме анонимного класса? - PullRequest
0 голосов
/ 02 марта 2020

https://docs.oracle.com/javase/specs/jls/se13/html/jls-6.html#jls -6.7 указывает, что

Каждый класс, интерфейс элемента и тип массива могут иметь полное имя:

Класс члена или интерфейс M другого класса или интерфейса C имеет полностью определенное имя, если и только если C имеет полностью определенное имя. В этом случае полностью определенное имя M состоит из полностью определенного имени C, за которым следует ".", За которым следует простое имя M.

Но согласно тому же c, каждый класс или интерфейс имеют FQN.

Каждый тип примитива, именованный пакет, класс верхнего уровня и интерфейс верхнего уровня имеют полное имя

С может сопереживать в этом do c, тогда каков пример члена без квалифицированного имени согласно этому do c кроме анонимных классов? Если дело обстоит только с анонимными классами, то почему может определено таким общим способом?

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Но согласно тому же действию c, каждый класс или интерфейс имеют FQN.

Нет: документы, которые вы цитируете говорят (выделено мое):

Каждый тип примитива, именованный пакет, верхний уровень класс и верхний уровень интерфейс имеет полностью определенное имя

О классах-членах, интерфейсах-членах и типах массивов они говорят (выделено мной):

  • У класса-члена или интерфейса-члена M другого класса или интерфейса C есть полное имя если и только если C имеет полное имя.
  • Тип массива имеет полное имя, если и только если его тип элемента имеет полное имя name.

И (акцент все еще мой):

A локальный класс или анонимный класс не имеет полностью определенного имени.

Так что не только анонимные классы, но и некоторые классы-члены, интерфейсы-члены и типы массивов могут не имеют полностью определенного имени, а локальные классы никогда не делают. Вот демонстрация некоторых примеров:

class Outer {
    // anonymous class has no FQN
    Runnable r = new Runnable() {
        // member class has no FQN, because its enclosing class has no FQN
        class Member {}

        public void run() {
            // array type has no FQN, because its element type has no FQN
            Member[] members = new Member[3];

            // local class has no FQN
            class Local {}
        }
    };
}
0 голосов
/ 02 марта 2020

Локальный класс или анонимный класс не имеют полностью определенного имени.

Таким образом, исключается

public static void main(String[] args) {
    class MyLocal{}
}

Тип массива имеет полностью квалифицированное имя, если и только если его тип элемента имеет полностью квалифицированное имя.

Таким образом исключается

public static void main(String[] args) {
    class MyLocal{}      // doesn't have
    MyLocal[] arr = {};  // nor this one
}

Класс члена или интерфейс члена M другого класса или Интерфейс C имеет полностью определенное имя, если и только если C имеет полностью определенное имя.

Так что исключает

public static void main(String[] args) {
    class MyLocal{}
    class MyLocalChild extends MyLocal {}
}
...