我有一个班级联系人,我在下面显示。我希望每个联系人对象都有一个其他联系人列表。我选择 a 是TreeSet
因为我想避免在同一个列表中出现重复的联系人。我的 Contact 类实现Comparable
并具有一个构造的 compareTo() 方法,用于比较实例 String 变量。我知道添加到 TreeSet 时使用 compareTo 方法,因为添加的元素会立即排序。
当我尝试将 Contact[] 中的 Contact 对象(请参阅下面的 setContacts() 方法)添加到 TreeSet 时,我收到一个ClassCastException
. 我的 system.out 消息是:
Exception in thread "main" java.lang.ClassCastException: shared.Contact cannot be cast to java.lang.String
at java.text.Collator.compare(Unknown Source)
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at shared.Contact.setContacts(Contact.java:51) <-- right here is the TreeSet.add()
at server.Server.readInContacts(Server.java:191)
at server.Server.main(Server.java:51)
我不明白的是,在我构建的任何类中,我都没有尝试将任何东西转换为字符串。下面是我的整个联系课程。
有没有人看到任何错误或看到异常发生的原因?
如果有人告诉我还有什么相关的,我很乐意发布更多代码。我不知道还有什么重要的看。提前致谢。
package shared;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.text.Collator;
import java.util.LinkedList;
import java.util.TreeSet;
public class Contact implements Serializable, Comparable<Contact>{
private static final long serialVersionUID = 1L;
private String name;
private boolean online;
private TreeSet<Contact> contacts;
private ObjectOutputStream oos;
private ObjectInputStream ois;
public Contact(String name){
this(name, null, null);
}
public Contact (String name, ObjectInputStream ois, ObjectOutputStream oos){
this.name = name;
this.ois = ois;
this.oos = oos;
contacts = new TreeSet<Contact>(Collator.getInstance());
}
public String getName(){
return name;
}
public void logIn(ObjectInputStream ois, ObjectOutputStream oos){
this.ois = ois;
this.oos = oos;
}
public ObjectInputStream getObjectInputStream(){
return ois;
}
public ObjectOutputStream getObjectOutputStream(){
return oos;
}
public void setOnlineStatus(boolean status){
online = status;
}
public boolean isOnline(){
return online;
}
public void setContacts(Contact[] contacts){
this.contacts.clear();
for (Contact c: contacts){
this.contacts.add(c); <-- right here is where my exception occurs
}
}
@Override
public int compareTo(Contact c){
return this.name.compareTo(c.getName());
}
public boolean equals(Object o){
Contact c = (Contact)o;
return this.name.equals(c.getName());
}
public void addContact(Contact c){
LinkedList<Contact> list = new LinkedList<Contact>();
for (Contact contact: contacts){
list.add(contact);
}
}
public Contact[] getContacts(){
return contacts.toArray(new Contact[0]);
}
public int hashCode(){
return name.hashCode();
}
public String toString(){
return this.name;
}
}