Javaで連想配列をクラスのインスタンス時に指定して、コンストラクタ内でそれぞれを設定したいのですが
Profile2.java
をコンパイル時に一番下のようなエラーが出ます。
自分としてはクラスのインスタンス時に引数に沢山書く代わりに、連想配列を渡して処理させようと思いました。
しかし、2つの問題が出てきました。
・継承したProfileのnameを設定出来ない
・HashMapのkeySet()部分が上手くいかない
どのように書き換えればいいのでしょうか?
よろしくお願いします。
Profile.java
/**
* Profile class
* @auther yyy
*/
public class Profile {
/** name */
private String name;
/**
* constructor
* @param name name
*/
Profile(String name) { // constructor
this.name = name;
}
}
MyProfile2.java
import java.util.Map;
import java.util.HashMap;
/* Main.java内抜粋
Map<String, Object> myprof = new HashMap<String, Object>(){
{
put("name", "John Lennon");
put("phone_number", "+81-90-0000-0000");
put("email", "lennonkun@gmail.com");
put("occupation", new String[]{"Programmer", "System Engineer"});
put("language", new String[]{"Japanese", "Spanish", "English"});
put("hobby", new String[]{"Traveling", "fishing", "photography"});
}
};
MyProfile2 me2 = new MyProfile2(myprof);
*/
public class MyProfile2 extends Profile {
private String email;
private String phone_number;
private String[] occupation;
private String[] language;
private String[] hobby;
public MyProfile2(HashMap myprof) {
for(String key: myprof.keySet()) {
switch(key) {
case "name": super(name);
case "email": this.email = (String)myprof.get(key);
case "phone_number": this.phone_number = (String)myprof.get(key);
case "occupation": this.occupation = (String[])myprof.get(key);
case "language": this.language = (String[])myprof.get(key);
case "hobby": this.hobby = (String[])myprof.get(key);
}
}
}
}
以下のエラーが出ます。
MyProfile2.java:11: エラー: クラス Profileのコンストラクタ Profileは指定された型
に適用できません。
public MyProfile2(HashMap myprof) {
^
期待値: String
検出値: 引数がありません
理由: 実引数リストと仮引数リストの長さが異なります
MyProfile2.java:12: エラー: 不適合な型: ObjectをStringに変換できません:
for(String key: myprof.keySet()) {
^
MyProfile2.java:14: エラー: superの呼出しはコンストラクタの先頭文である必要があ
ります
case "name": super(name);
^
エラー3個