2

次に例を示します。

import java.util.HashMap;

public class Test
{
    public static void main(String[] args)
    {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("leorum", 1);
        map.put("ipsum", 2);
        map.put("dolor", 3);

        System.out.println(map.keySet().toString());
    }
}

すべてが正常にコンパイルされ、実行されます。ただし、map.keySet()別の変数に移動すると:

import java.util.HashMap;

public class Test
{
    public static void main(String[] args)
    {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("leorum", 1);
        map.put("ipsum", 2);
        map.put("dolor", 3);

        Set<String> keys = map.keySet();
        System.out.println(keys.toString());
    }
}

エラーがスローされます:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    Set cannot be resolved to a type
    at Test.main(Test.java:12)

2 番目の例でエラーが発生する理由は理解できますが、最初の例ではエラーが発生しないのはなぜですか? map.keySet()Javaコンパイラは、 java.util.Setをインポートせずに何が返されるかをどのように認識しますか?

この動作は、他のプログラミング言語、特に C++ でも見られます。

4

5 に答える 5

5

2 番目の例でエラーが発生する理由は理解できますが、最初の例ではエラーが発生しないのはなぜですか? map.keySet()javaコンパイラは、インポートせずに何が返されるかをどのように認識しますjava.util.Setか?

どちらの方法でもそれを認識しています - それはバイトコードのメタデータの一部です。

それが知らないのは、あなたが何を意味するのかですSet<String>。インポートは、ソース コード内の名前の意味を変更するだけです。その名前は、ソース コードの最初のコード部分には表示されません。

JLS のセクション 7.5から:

インポート宣言を使用すると、名前付き型または静的メンバーを、単一の識別子で構成される単純な名前 (§6.2) で参照できます。

最初の例では単純な名前を参照していないため、上記の利点は関係ありません。

別の言い方をすれば、インポートはこの行を許可するだけです (これは 2 番目のサンプルで有効です)。

java.util.Set<String> keys = map.keySet();

次のように記述します。

Set<String> keys = map.keySet();

それだけです。

于 2013-07-09T15:43:40.287 に答える
2

ディレクティブは、importパッケージ名で修飾せずに型を参照できるようにする純粋な構文機能です。

最初のコードはSet型を参照しないため、インポートなしで正常に機能します。

importクラスの使用とは関係ありません。名前の書き方にのみ影響します。

于 2013-07-09T15:43:33.243 に答える