クラス名を考えるのが難しい

前に考えたクラス名を変更することにした。
 DoubleMap → DualKeyMap
 DoubleWideMap → DoubleMap

import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
/**
 * キーWide2重Map インターフェース.
 * <pre>
 * 2重のKeyによるMap、つまりネストされたマップで、Map<K,Map<P,V>> を扱うためのメソッド
 * 約束する。
 * Map<P,V> の P は、K と異なる型を指定することが可能にする為に宣言されたキー
 * DualKeyMap と異なるのは、、、
 *       DualKeyMap は、同じ型のKeyで2重のKey構成であるが、
 *       DoubleMapは、第1Keyと第2Keyが、異なる型で構成できることである
 * 実装クラスは、DouleHashMap,DoubleLinkedHashMap,DoubleTreeMap で
 * 、new 演算子コンストラクタで生成する。
 */

public interface DoubleMap<K,P,V>{
   /**
    * 値の格納.
    * @param key1 第1のKey
    * @param key2 第2のKey
    * @param value 格納値
    * @return 古い値が存在すればその値、無ければ NULL が返る。
    */

   public V put(K key1,P key2,V value);

   /**
    * Mapの格納.
    * @param key1 第1のKey
    * @param map Map<P,V>
    * @return 古い Map<P,V>が存在すればそのマップ、無ければ NULL が返る。
    */

   public Map<P,V> put(K key1,Map<P,V> map);

   /**
    * 値の取得.
    * @param key1 第1のKey
    * @param key2 第2のKey
    * @return key1とkey2の組合せが指す値
    */

   public V get(K key1,P key2);

   /**
    * Mapの取得.
    * @param key1 第1のKey
    * @return key1が指すMap
    */

   public Map<P,V> get(K key1);

   /**
    * 第1Key の存在確認
    * @param key1 第1のKey
    * @return true=key1 が存在
    */

   public boolean containsKey(K key1);

   /**
    * 第1Key と第2Key の組合せ、存在確認
    * @param key1 第1のKey
    * @param key2 第2のKey
    * @return true=「第1Key と第2Key の組合せ」が存在する。
    */

   public boolean containsKey(K key1,P key2);

   /**
    * 格納されている値の全個数サイズを返す。
    * @return 全個数サイズ
    */

   public int size();

   /**
    * 第1Key が指すマップサイズを返す。
    * @param key1 第1Key
    * @return key1が指すMapのsize()
    */

   public int size(K key1);

   /**
    * 第1KeyのキーSetを取得
    * @return Set<K>
    */

   public Set<K> keySet();

   /**
    * 第2KeyのキーSetを取得
    * @param key1 第1Key
    * @return key1で取得できるMapのkeyのSet<P>
    */

   public Set<P> keySet(K key1);

   /**
    * Mapコレクション取得
    * @return Collection<Map<P,V>> 第1Keyが指すMapの並び
    */

   public Collection<Map<P,V>> values();

   /**
    * 値コレクション取得
    * @param key1 第1Key
    * @return key1で取得できるMapのvalues()に相当
    */

   public Collection<V> values(K key1);

   /**
    * マップ全体クリア
    */

   public void clear();

   /**
    * 第1Keyが指すマップをクリア
    * @param key1 第1Key
    */

   public void clear(K key1);

   /**
    * マップの離脱
    * @param key1 第1Keyが指すマップを離脱
    * @return 離脱前のMapを取得
    */

   public Map<P,V> remove(K key1);

   /**
    * 値の離脱
    * @param key1 第1Key
    * @param key2 第2Key
    * @return 脱前の値を取得
    */

   public V remove(K key1,P key2);

   /**
    * このマップに含まれるマップの Set ビューを返します。
    * @return Set<Entry<K,Map<P,V>>>
    */

   public Set<Entry<K,Map<P,V>>> entrySet();

   /**
    * 指定されたオブジェクトがこのマップと等しいかどうかを比較します。
    * @param o このマップと等しいかどうかを比較するオブジェクト
    * @return 指定されたオブジェクトがマップと等しい場合は true
    */

   public boolean equals(Object o);

   /**
    * マップのハッシュコード値を返します
    * @return マップのハッシュコード値
    */

   public int hashCode();
}