【问题标题】:Reading TreeMap from file (Java)?从文件(Java)中读取TreeMap?
【发布时间】:2017-08-14 01:24:35
【问题描述】:

对于学校作业,我必须创建一个程序,让用户可以选择将联系人保存到文件并使用 TreeMap 列出文件中的所有联系人。我编写了代码来将地图中的联系人保存到文件中并从中读取它们,但是在尝试编译时出现错误,上面写着:“不兼容的类型:对象无法转换为 ContactInfo”声明 ContactInfo ci = contact.getValue(); How我要解决这个问题吗?

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

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() );
}

【问题讨论】:

  • 你的 ContactInfo 实现了 Serializable?

标签: java dictionary serialization io treemap


【解决方案1】:

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

我建议不要像建议的那样进行不安全的转换,我建议在 for 循环中的 Map.Entry 中包含对象类型:

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

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

}

【讨论】:

  • 这确实比我的回答好。
【解决方案2】:

您似乎正在以“对象”类型读取和写入您的联系人。 尝试像这样投射你的价值:

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

如果 java 告诉你不能转换它,你将不得不寻找另一个 wat 来保存/加载这些对象。

【讨论】:

    【解决方案3】:

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

    在您的问题中,您可以通过两种方式做到这一点:

    1、

    Map.Entry&lt;String, ContactInfo&gt; contact : contacts.entrySet()

    2、

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多