You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型的变量。

修复步骤

  1. 修改泛型参数名称:将泛型参数从String改为通用名称(比如E,代表Element),避免和Java自带类名冲突。
  2. 修正toString()方法:明确使用java.lang.String(此时不再被泛型遮蔽)作为返回类型,并修复遍历逻辑。
  3. 修复其他代码缺陷:补充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:55:14