1

[コミュニティのためにこれを再開することに投票します。Map.get(Object key) が (完全に) ジェネリックではない理由は何ですかという質問は、実際に問題の根本原因を突き止めています。しかし、私にとってスタック オーバーフローとは、質問に答えたり、実際のサンプル コードにアクセスしたり、特定の API 使用例をサポートしたりすることであり、固有の根本原因の規範を作成することではありません。タイトルのせいか、他の投稿を見つけることができませんでした。列挙型は、名前付き定数の安全な代替手段を提供するために作成されました。この問題はその利点を台無しにします -- API で言及せず、コンパイラの警告もなしに。安全性のレベルを名前付き定数のレベルよりも低くするのはなぜですか? 列挙型ユーザーにとって、この質問は役に立ちます -- Google で 1 位になっています。]

これはコンパイルされるはずですか?EnumAlpha 型で初期化された enumMap から別の型 (EnumDelta) の列挙型メンバーを取得していますが、そうです。ジェネリック型として、EnumMap は EnumAlpha に関して型安全性を保証すると考えました。

    import java.util.EnumMap;

    class Enum {

            static enum EnumAlpha { ALPHA, BETA; }
            static enum EnumDelta { DELTA, EPSILON; }



            static EnumMap<EnumAlpha, String> enumMap = null;

            public static void main (String[] args) {

                    enumMap = new EnumMap<EnumAlpha, String>(EnumAlpha.class);
                    String string = "foo";

                    enumMap.put(EnumAlpha.ALPHA, string);

                    //why does this line compile?
                    System.out.println(enumMap.get(EnumDelta.DELTA)); 


            }


    }

プログラム出力:

ヌル

4

1 に答える 1

1

このリンクされた投稿の説明により、EnumMap.get() に関しては答えはノーです。

次の行を追加することで、わかりにくい null ポインター例外を回避できました。

     assert enumMap.containsKey(EnumDelta.EPSILON);
于 2016-07-01T02:57:51.533 に答える