解決する次のシナリオ: 特定の id+classtype に応じて、果物のリストを返すか保存するクラスを作成する必要があります。だから私は自分自身に疑問を呈していCollection
ましCollection
た。キーと値の原則は私のユースケースによく似ているため、すべてのリストを保存するために単一HashMap
の試みを行うことにしました。2 つの側面 (私の場合は id と果物クラス)、値を識別します。
そこで、独自のキー オブジェクトを作成しました。
class FruitKey
{
int id;
Class<? extends Fruits> type;
public FruitKey( int id, Class<? extends Fruits> type )
{
this.id = id;
this.type = type;
}
//equals, hashcode, etc.
}
を作成した後Map<FruitKey, List<? extends Fruits>>
、 put は完全に正常に機能しますが、もちろん、FruitLists を Map から取得しようとすると、特定の果物の種類を保証できず、結果をキャストする必要があります。
public static void main( String[] args )
{
Map<FruitKey, List<? extends Fruits>> fruitMap = new HashMap<>();
Apple oneApple = new Apple();
List<Apple> manyApples = new ArrayList<>();
manyApples.add( oneApple );
fruitMap.put( new FruitKey( 1, Apple.class ), manyApples);
//Any way to avoid typesafty and cast?
List<Apple> myApples = (List<Apple>) fruitMap.get( new FruitKey( 1, Apple.class ) );
}
classtype はすでにキーに含まれているので、これらをマップの値に関連付けることができると思ったのですが、残念ながらマップを特別な果物専用にすることなく、成功しませんでした。タイプセーフ/クラスキャストの問題を回避する可能性はありますか、それとも私の目的を達成するために別のコレクションタイプを推奨できますか? もちろん、果物ごとにマップを作成することもできますが、おいしい果物がたくさんあるので、それらを常に区別する必要があるため、それを避けようとしました.
要するに、これは私が欲しいものです:
List<Apple> apples = SomeCollection.get( Key(id, Apple.class) );
Id も存在する理由は、同じマップ内に複数のリンゴのリストと、他の果物の複数のリストが存在する可能性があるためです。