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
相关产品推荐
相关产品推荐

