Java自定义List类无法重写toString()方法求助
问题分析与解决方法
错误根源
你的List类使用了String作为泛型类型参数的名称,这会遮蔽Java自带的java.lang.String类。在整个List类中,所有的String标识符都指代泛型类型变量,而非Java标准的字符串类,这直接导致两个编译错误:
- 重写
toString()时,方法返回的是泛型String,但Object.toString()要求返回java.lang.String,类型不兼容。 String string = "";中,""是java.lang.String实例,无法赋值给泛型String类型的变量。
修复步骤
- 修改泛型参数名称:将泛型参数从
String改为通用名称(比如E,代表Element),避免和Java自带类名冲突。 - 修正
toString()方法:明确使用java.lang.String(此时不再被泛型遮蔽)作为返回类型,并修复遍历逻辑。 - 修复其他代码缺陷:补充
first()方法的返回语句,修正ListPlayground中的实例化语法错误。
完整修复后的代码
修复后的List<E>类
public class List<E> { private class Node { private E element = null; private Node next = null; private Node(E element, Node next) { this.element = element; this.next = next; } private Node(E element) { this.element = element; } } private Node head = null; public void prepend(E object) { head = new Node(object, head); } public void append(E object) { if(head == null) { head = new Node(object); return; } Node current = head; while(current.next != null) { current = current.next; } current.next = new Node(object); } public E first() { return get(0); // 补充return语句 } public E get(int index) { Node current = head; for(int i = 0; i < index; i++) { current = current.next; } return current.element; } public int size() { Node current = head; int size = 0; for(; current != null; size++) { current = current.next; } return size; } @Override // 添加@Override注解,明确是重写方法 public String toString() { StringBuilder builder = new StringBuilder(); // 用StringBuilder提升性能 Node current = head; // 用局部变量遍历,不影响类状态 while(current != null) { builder.append(current.element); if(current.next != null) { builder.append(" -> "); } current = current.next; } return builder.toString(); } }
修复后的ListPlayground类
public class ListPlayground { public static void main(String[] args) { List<String> stringliste = new List<>(); // 修正菱形语法 stringliste.append("World"); stringliste.append("!"); stringliste.prepend("Hello"); System.out.println("The Length of the List is: " + stringliste.size()); System.out.println("The first Element of the List is: " + stringliste.first()); System.out.println("The element with Index 2 is: " + stringliste.get(2)); System.out.println("The last element is: " + stringliste.get(stringliste.size() - 1)); System.out.println("The whole List is: " + stringliste.toString()); System.out.println("And again the whole List " + stringliste.toString()); } }
额外说明
- 添加
@Override注解可以让编译器帮你检查是否正确重写了父类方法,避免类似的类型错误。 - 使用
StringBuilder代替字符串拼接(+=)可以提升循环中的字符串构建性能,尤其是列表元素较多时。 - 移除了类成员变量
current,改用局部变量遍历列表,避免多次调用toString()时因为成员变量状态变化导致的错误输出。
内容的提问来源于stack exchange,提问作者Valerij
相关产品推荐
相关产品推荐

