プリティプリントと呼ばれる関数を実装するインターフェイスFeatureValueがあります。
現在、そのインターフェイスを実装する2つのクラスがあります。FeatureStringとFeatureList(FeatureListのリストには文字列が含まれています)。これらのクラスは、文字列とリストをそれぞれ格納し、ラップされた値に対してプリティプリント関数を実装する単なるラッパーです。
機能タイプの列挙型(文字列に対応するものとリストに対応するもの)をキーとして受け取るEnumMapがあります。
私はもともとこのインターフェースを作成したので、列挙型を繰り返し処理してきれいに印刷することができました。しかし、ラッパーのFeatureValueからも値を取得できるようにしたいと思います。
列挙型マップをとして保存している<Feature, FeatureValue>
ので、ラップされた値がどのタイプであるかがわからないため、取得時にキャストする必要があります。
キャストする必要がないようにコードをリファクタリングする方法はありますが、タイプを知らなくても列挙型を繰り返し処理して出力する機能は保持されますか?
列挙型
public enum Features
{
KIND("kind"),
RULE("rule"),
PROBLEM("problem"),
private String name;
Features(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
インターフェース
public interface FeatureValue
{
public String prettyPrint();
}
リストの実装(FeatureStringにも同様のものがありますが省略します)
public class FeatureList implements FeatureValue
{
private final List<String> list;
public FeatureList(List<String> list)
{
this.list = list;
}
@Override
public String prettyPrint()
{
return Arrays.toString(list.toArray());
}
public List<String> getList()
{
return list;
}
}
キャストコード
for(String token: ((FeatureList) enumMap.get(Feature.particularFeatureThatCorrespondsToLists)).getValue())
doSomething(token);
マップはFeatureListではなくFeatureの値に対してパラメータ化されているため、キャストが必要です。