2011-07-26 4 views
2

私はクラスを持っており、フルーツと呼ぶことができ、ハッシュマップを持っています。 Fruitの新しいインスタンスを初期化することができますが、HashMapの値に設定することができます。だから、例えば:HashMapを具象クラスにキャストするにはどうすればよいですか?

Map<String, String> map = new HashMap<String, String>(); 
map.put("name", "Banana"); 
map.put("color", "Yellow"); 

それから私はそうのような新しいフルーツのインスタンスを初期化したい:

Fruit myFruit = new Fruit(map); 

または

Fruit myFruit = (Fruit)map; 

反復によって、Javaでこのことが可能です地図?

+0

私は、マップから値を取得するコンストラクタを記述しないと思いますか? – Jacob

+0

私の申し訳ありませんが、あなたが言及したようにコンストラクタなし。私は地図を反復することができ、反復の値を設定する必要があります。 –

答えて

5

HashMapFruitではないため、2番目の値は使用できません。 Map<String, String>引数を取るコンストラクタを提供することで、最初に行うことができます。

public Fruit(Map<String, String> map) { 
    this.name = map.get("name"); 
    this.color = map.get("color"); 
} 
+0

ええ、私は実際に反射を使用することを意味しました...私はこのことについて明確ではないことを謝ります。 –

0

コンストラクタでマップをトラバースして値を割り当てます。これを行うための実際のライブラリがある場合(ほとんどBeanのように)、私はそれについて聞いたことがありません。

ハッシュマップを果物にキャスティングすることはできません。

1

はい、可能です。しかし、マップから値を引き出す方法を知っているFruitのコンストラクタを書く必要があります。

public Fruit(Map params) { 
    this.setColor(map.get("color")); 
    this.setName(map.get("name")); 
} 
0

2つ目は不可能ですが、マップをコンストラクタパラメータとして使用するクラスを作成できます。 mapのキーを想定し

class Fruit{ 

    private Map<String, String> fruitMap; 

    Fruit(Map<String, String> map){ 

    } 

} 
0

Fruitクラスのsetterメソッドに対応して、あなたはPropertyUtilsようにApache Beanのユーティリティのいずれかを使用することができます。

final Fruit f = new Fruit(); 
for(String key : map.keySet()) { 
    PropertyUtils.setProperty(fruit, key, map.get(key)); 
} 
0

非常に複雑なケースの場合は、Dozerをご覧ください。非常に大きなマップを非常に大きなオブジェクトにマップするために、Dozerを使用します。

2

あなたは反射を使うことができるようです。

Fruit f = new Fruit(); 
Class aClass = f.getClass(); 
for(Field field : aClass.getFields()){ 
    if(map.containsKey(field.getName())){ 
    field.set(f,map.get(field.getName)); 
    } 
} 
+0

aClass.getFields()は、クラスのフィールドがプライベートでない場合にのみ機能しますか? – hwak

関連する問題