2017-08-14 31 views
0

学校の割り当てには、連絡先をファイルに保存し、ツリーマップを使用してファイル内のすべての連絡先を一覧表示するオプションをユーザーに与えるプログラムを作成する必要があります。私はマップ内の連絡先をファイルに保存し、そこから読み取るコードを書いたが、コンパイル時にエラーが発生する:「互換性のないタイプ:オブジェクトはContactInfoに変換できません」ContactInfo ci = contact.getValue();これを修正しますか?ファイルからツリーマップを読み込む(Java)?

マップに連絡先を追加し、ファイルにマップを書き込むために、関連するコード:

ContactInfo c = new ContactInfo(); 

System.out.print("First name: "); 
String fName = s.next(); 
System.out.print("Last name: "); 
String lName = s.next(); 
c.setName(fName, lName); 

System.out.print("Phone #: "); 
String p = s.next(); 
c.setPhone(p); 

System.out.print("Email address: "); 
String e = s.next(); 
c.setEmail(e); 

contacts.put(lName, c); 

try 
{ 
    ObjectOutputStream out = new ObjectOutputStream(
          new BufferedOutputStream(
          new FileOutputStream(fileName))); 

    out.writeObject(contacts); 
} 

catch(Exception ex) 
{ 
    System.out.println("Error saving contact to file."); 
} 

すべての連絡先を一覧表示するには、関連するコード:

try 
{ 
    ObjectInputStream in = new ObjectInputStream(
          new BufferedInputStream(
          new FileInputStream(fileName))); 

    contacts = (TreeMap< String, ContactInfo >) in.readObject(); 

    in.close();     
} 

catch(Exception exc) 
{ 
    System.out.println("Error displaying contacts."); 
} 

for(Map.Entry contact : contacts.entrySet()) 
{ 
    ContactInfo ci = contact.getValue(); 
    System.out.println(ci.getName() + "\t" + ci.getPhone() + "\t" + ci.getEmail()); 
} 
+0

あなたのContactInfoはSerializableを実装しますか? – rayen

答えて

2

にあなたがしているようですあなたの連絡先を「オブジェクト」タイプとして読み書きします。 このようなあなたの値をキャストしてみます:

ContactInfo ci = (ContactInfo) contact.getValue(); 

Javaは、あなたがそれをキャストすることはできません表示されたら、あなたはこれらのオブジェクトをロード/セーブするために別のワットを見つける必要があります。

4

Map.Entryにオブジェクトの種類を指定しなかったため、エラーが発生します。オブジェクトの型が宣言されていない場合は、キーと値の両方についてObjectを扱っています。問題の理由は、消去を入力している

for(Map.Entry<String, ContactInfo> contact : contacts.entrySet()) { 

    String key = contact.getKey(); 
    ContactInfo value = contact.getValue(); 

} 
+0

これは本当に私の答えよりも優れています。 – Vanpourix

1

むしろ危険なキャストよりも、示唆されたように、私はループの中にあなたのMap.Entryでオブジェクトタイプを含めることをお勧めします。これはジェネリックがコンパイラのトリッキーによってJavaで実装されているからです。コンパイルされたジェネリックコードは、T(または他の型パラメータ)について話しているところでjava.lang.Objectを使用するだけです。あなたの質問に

、あなたは二つの方法でこれを行うことができます。

1、

Map.Entry<String, ContactInfo> contact : contacts.entrySet()

2、

ContactInfo ci = (ContactInfo)contact.getValue();

関連する問題