数据结构-java-单链表中结点内部为T模板类型拷贝失败问题解决

mac2024-11-08  7

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io,IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; //单链表结点类 public class Node<T> implements Serializable{ /** * */ private static final long serialVersionUID = 1636144465925665265L; public T data; //数据域,存储数据元素 public Node<T> next; //地址域,引用后继结点 public Node(T data, Node<T> next) //构造结点,data指定数据元素,next指定后继结点 { // if(data instanceof TermX) { // try { // this.data = (T) ((TermX) data).clone(); // } catch (CloneNotSupportedException e) { // // TODO 自动生成的 catch 块 // e.printStackTrace(); // } //T对象引用赋值 // } try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(data); // 将流序列化成对象 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); T data1; data1 = (T) ois.readObject(); this.data = data1; //T对象引用赋值 } catch (ClassNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } this.next = next; //Node<T>对象引用赋值 } public Node() { this(null, null); } public String toString() //返回结点数据域的描述字符串 { return this.data.toString(); } @SuppressWarnings("unchecked") public boolean equals(Object obj) //比较两个结点值是否相等,覆盖Object类的equals(obj)方法 { return obj==this || obj instanceof Node<?> && this.data.equals(((Node<T>)obj).data); } }

通过实现Serializable接口来实现对象的不可变性,然后通过写入ObjectOutputStream写入流,在通过ByteArrayInputStream读入就可以,使得重新获得的对象和原来的对象不同。

最新回复(0)