从文件 (Java) 读取 TreeMap?
Reading TreeMap from file (Java)?
对于学校作业,我必须创建一个程序,让用户可以选择将联系人保存到文件并使用 TreeMap 列出文件中的所有联系人。我编写了代码以将地图中的联系人保存到文件并从中读取它们,但是在尝试编译时出现错误:"incompatible types: object cannot be converted to ContactInfo" 语句 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." );
}
列出所有联系人的相关代码:
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() );
}
您似乎正在以 'Object' 类型读取和写入您的联系人。
试着这样表达你的价值观:
ContactInfo ci = (ContactInfo) contact.getValue();
如果 java 告诉你不能施放它,你将不得不找到另一个 wat save/load 这些对象。
错误发生是因为您没有在Map.Entry
中指定对象的类型。如果未声明对象的类型,则您正在处理键和值的 Object
。
我建议在 for 循环中的 Map.Entry
中包含对象类型,而不是建议的不安全转换:
for(Map.Entry<String, ContactInfo> contact : contacts.entrySet()) {
String key = contact.getKey();
ContactInfo value = contact.getValue();
}
问题的原因是Type Erasure。这是因为泛型是通过编译器技巧在 Java 中实现的。编译后的通用代码只使用 java.lang.Object 无论你在哪里谈论 T (或其他一些类型参数)。
在你的问题中,你可以通过两种方式做到这一点:
1、
Map.Entry<String, ContactInfo> contact : contacts.entrySet()
2、
ContactInfo ci = (ContactInfo)contact.getValue();
对于学校作业,我必须创建一个程序,让用户可以选择将联系人保存到文件并使用 TreeMap 列出文件中的所有联系人。我编写了代码以将地图中的联系人保存到文件并从中读取它们,但是在尝试编译时出现错误:"incompatible types: object cannot be converted to ContactInfo" 语句 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." );
}
列出所有联系人的相关代码:
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() );
}
您似乎正在以 'Object' 类型读取和写入您的联系人。 试着这样表达你的价值观:
ContactInfo ci = (ContactInfo) contact.getValue();
如果 java 告诉你不能施放它,你将不得不找到另一个 wat save/load 这些对象。
错误发生是因为您没有在Map.Entry
中指定对象的类型。如果未声明对象的类型,则您正在处理键和值的 Object
。
我建议在 for 循环中的 Map.Entry
中包含对象类型,而不是建议的不安全转换:
for(Map.Entry<String, ContactInfo> contact : contacts.entrySet()) {
String key = contact.getKey();
ContactInfo value = contact.getValue();
}
问题的原因是Type Erasure。这是因为泛型是通过编译器技巧在 Java 中实现的。编译后的通用代码只使用 java.lang.Object 无论你在哪里谈论 T (或其他一些类型参数)。
在你的问题中,你可以通过两种方式做到这一点:
1、
Map.Entry<String, ContactInfo> contact : contacts.entrySet()
2、
ContactInfo ci = (ContactInfo)contact.getValue();