从文件(Java)中读取TreeMap?

时间:2017-08-14 01:24:36

标签: java dictionary serialization io treemap

对于学校作业,我必须创建一个程序,为用户提供将联系人保存到文件的选项,并使用TreeMap列出文件中的所有联系人。我编写了代码来将地图中的联系人保存到文件中并从中读取它们,但是在尝试编译时会出现错误:“不兼容的类型:对象无法转换为ContactInfo”语句{{1}我该如何解决这个问题?

将联系人添加到地图然后将地图写入文件的相关代码:

ContactInfo ci = contact.getValue();

列出所有联系人的相关代码:

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." );
}

3 个答案:

答案 0 :(得分:4)

发生错误是因为您在Map.Entry中没有指定对象的类型。如果未声明对象的类型,则表示您正在处理密钥和值的Object

我建议您将Map.Entry中的对象类型包含在for循环中,而不是不安全的强制转换:

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

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

}

答案 1 :(得分:2)

您似乎正在阅读和写下您的联系人类型&#39;对象&#39;。 试着像这样投射你的价值:

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

如果java告诉你无法施放它,你将不得不找到另一个wat来保存/加载这些对象。

答案 2 :(得分:1)

问题的原因是Type Erasure。这是因为泛型是通过编译器技巧在Java中实现的。编译的通用代码只使用java.lang.Object,无论你在哪里谈论T(或其他类型的参数)。

在您的问题中,您可以通过两种方式执行此操作:

1,

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

2,

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