Доступность импорта подстановочных знаков Java для вложенных статических классов

Как работает доступность Java (или, возможно, область действия) по отношению к многоуровневым вложенным классам импорта типов? Пример:

КлассA.java:

package com.oracle.javatests;

public class ClassA {

    public static class NestedAA {
        public void printSomething() {
            System.out.println("inside " + this.getClass().getName());
        }
        
        public static class NestedAB{
            public void printSomethingAB() {
                System.out.println("inside " + this.getClass().getName());  
            }
        }
    }
    
    public void printSomething() {
        System.out.println("inside " + this.getClass().getName());
    }
}

Main.java

package com.oracle.javatests;

import com.oracle.javatests.ClassA.*;
// import com.oracle.javatests.ClassA.NestedAA.*; // Adding this will resolve NestedAB

public class Main {

    public static void main (String[] args){
        ClassA objA = new ClassA();
        objA.printSomething();
        
        NestedAA nestedAA = new NestedAA(); // Ok
        NestedAB nestedAB = new NestedAB(); // Compiler error- NestedAB cannot be resolved to a type
    }
}

Оператор импорта не импортирует тип NestedAB при использовании подстановочных знаков. Возможно, похожий вопрос привел меня к спецификации java, которая разъясняет тип-импорт-по-запросу Объявления :

Объявление type-import-on-demand позволяет импортировать все доступные типы именованного пакета или типа по мере необходимости.

Принятый ответ на вопрос подразумевает, что декларации импорта по запросу не являются рекурсивными. Причина, возможно, заключается в том, что Java рассматривает все доступные типы именованного типа и общая концепция пакетов, но мне не удается соединить точки и понять, что означают доступные типы по отношению к вложенным классам.

Может ли кто-нибудь помочь объяснить, как импорт и доступность типа работают в java (игнорируя спорное использование импорта подстановочных знаков)


person viacea    schedule 25.05.2021    source источник
comment
Если вы хотите получить доступ к внутреннему классу, вам необходимо иметь доступ как к внешнему, так и к внутреннему классу.   -  person dan1st    schedule 25.05.2021
comment
Хорошо, но почему оператор импорта подстановочных знаков не может сделать то же самое?   -  person viacea    schedule 25.05.2021
comment
Классы должны быть доступны для класса с оператором импорта, но здесь это не проблема, поскольку класс и внутренние классы являются общедоступными. Проблема в том, что импорт нерекурсивный. Поэтому вам нужно либо импортировать ClassA.NestedAA.NestedAB, либо указать новый NestedAA.NestedAB().   -  person Neil Coffey    schedule 25.05.2021
comment
P.S. Однако невероятно редко можно импортировать (или даже использовать) класс, вложенный более чем на 1 уровень вглубь внешнего класса.   -  person Neil Coffey    schedule 25.05.2021
comment
Спасибо. Я хотел понять, является ли импорт нерекурсивным по дизайну, потому что это явно не упоминается ни в одном документе, который я смог найти. Или это ограничено областью действия java или пакетом «безопасность» или чем-то еще. Я согласен, внутренние классы невероятно редки и определенно не разработаны намеренно. В нашем случае это произошло в результате синтаксического анализа очень большого xsd, при этом каждый новый тип анализировался как внутренний класс, что в некоторых случаях приводило к более чем 10 уровням вложенности.   -  person viacea    schedule 25.05.2021


Ответы (1)


Это не слышно, чтобы понять. import static com.foo.bar.*; это то же самое, что и import static com.foo.bar.[everything you can imagine here but without dots].

Другими словами, в вашем примере с import static pkg.ClassA.*; вы можете просто написать NestedAA без квалификаторов, и это сработает, потому что import static pkg.ClassA.NestedAA; сделал бы то же самое.

Вы не можете написать NestedAB без оговорок и ожидать, что это сработает; нет ничего, что вы могли бы написать вместо * (который не включает точки), что заставит это работать, поэтому импорт звездочки тоже не заставит это работать.

person rzwitserloot    schedule 25.05.2021
comment
Спасибо. Ясно, что java этого не принимает... я хотел понять, почему. - person viacea; 25.05.2021