一部のコンテナー クラスは、基本クラス "Table" (WoodenTable、MetalTable など) のオブジェクトのリストを保持します。各テーブル クラスは、その MaterialType (MaterialType.Wood、MaterialType.Metal...) を保持します。問題は、Table の各 SubClass を返すコンテナ クラスに適切な getter メソッドを提供する方法です。
これまでのところ、次の方法を見つけました。
1.マテリアルタイプをパラメータとするGetter。T の型が materialType に対応しない場合、ここで危険なのは ClassCastException です。
<T extends Table> T getTable(MaterialType materialtype)
WoodenTable table = getTable(MaterialType.Wood);
MetalTable table = getTable(MaterialType.Wood); // ups... exception
2.クラスパラメータを持つゲッター。安全ですが、ユーザーにとっては明確ではありません (パラメーターとしての MaterialType と比較して):
<T extends Table> T getTable(Class<T> tableClass)
WoodenTable table = getTable(WoodenTable.class);
3.各テーブル サブクラスのゲッター。新しいテーブル サブクラスを使用、作成、および追加するのが面倒です。
WoodenTable getWoodenTable()
WoodenTable table = getWoodenTable();
4.Table インターフェイスのみのゲッター。必要に応じて、コンテナ クラスの外で行われるキャスト。
Table getTable(MaterialType materialType)
WoodenTable woodenTable = (WoodenTable)getTable(MaterialType.Wood)
それを行う他の(より良い)方法はありますか?そうでない場合、それらのうちどれが最も適切であるか、または臭いが最も少ないでしょうか?