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

Java中存储Book类对象的LinkedList调用get方法取值报错原因咨询

报错根本原因

你遇到的是Java泛型的原生类型擦除问题,具体问题出在Library类的定义上:

  • 你声明listOfBooks成员变量时,用的是没有指定泛型参数的原生类型LinkedList,而不是LinkedList<Book>
  • 对应的getListOfBooks()方法返回值也定义为原生类型LinkedList,没有携带泛型信息

虽然你初始化的时候写了new LinkedList<Book>(),但是Java编译器只会根据变量的声明类型做静态类型检查,原生类型的集合默认返回的元素类型是Object,所以你调用get(2)拿到的是Object类型对象,直接赋值给Book类型的变量自然会报类型不匹配的编译错误。

理解误区说明

你默认运行时的泛型信息会被编译器识别,但Java的泛型是编译期的擦除实现,只要变量声明没有带泛型参数,编译器就不会做类型推断,会直接当成原生类型处理,不管你初始化的时候指定了什么泛型。

修复方案

方案1(规范推荐):给Library类的集合声明加上泛型

修改Library类的代码如下:

public class Library {
   // 声明时指定泛型为Book
   private LinkedList<Book> listOfBooks = new LinkedList<>();

   public void addBook(Book book){
       listOfBooks.add(book);
   }

   // 返回值也携带泛型信息
   public LinkedList<Book> getListOfBooks(){
       return listOfBooks;
   }
}

修改后编译器就能识别集合存储的是Book类型,原有报错行会自动通过校验。

方案2(临时兼容,不推荐):在调用处强制类型转换

直接修改报错行代码,手动做类型强转:

Book book1 = (Book) library.getListOfBooks().get(2);

该方案会丢失编译期类型检查能力,后续如果集合里存入非Book类型对象,运行时会抛出类型转换异常。

内容的提问来源于stack exchange,提问作者Angie0147

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 11:30:04