1

型インポートのマルチレベルのネストされたクラスに関して、Java のアクセシビリティ (またはスコープ) はどのように機能しますか? 例:

ClassA.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 タイプをインポートしません。おそらく同様の質問により、 Type-Import-on-Demand Declarationsを明確にする Java スペック シートにたどり着きました。

type-import-on-demand 宣言を使用すると、名前付きパッケージまたは型のすべてのアクセス可能な型を必要に応じてインポートできます。

質問に対する受け入れられた回答は、オンデマンドのインポート宣言が再帰的ではないことを意味します。その理由は、おそらくJavaが「名前付きタイプのすべてのアクセス可能なタイプ」と見なすものであり、パッケージの一般的な概念ですが、ドットを接続してアクセス可能なタイプがネストされたクラスに関して何を意味するかを理解していません。

タイプのインポートとアクセシビリティがJavaでどのように機能するように見えるかを説明してください(ワイルドカードインポートの議論の余地のある使用を無視しながら)

4

1 に答える 1