Java泛型实现ArrayList存储Date/boolean类型及类型转换报错解决
问题原因
- 你定义的
UserInfo<T>中的ArrayList<T>为单类型泛型集合,仅支持存储同一种类型的元素,你尝试同时存入Date、int、boolean三种不同类型的数据,本身不符合单泛型集合的设计规则 ArrayList的add()方法没有三个入参的重载,你一次性传入三个参数调用add属于语法错误- 你在使用
UserInfo时未指定泛型的具体类型,默认原始类型下传入Date会触发类型不匹配的编译报错 Logger类中初始化的obj集合为空,直接调用get(0)会在运行时抛出索引越界异常
修正方案
推荐使用实体类封装日志字段的规范写法,避免泛型强转的风险:
// 日志数据实体类 import java.util.Date; public class LogEntry { private Date operateDate; private int tryCount; private boolean pinCorrect; public LogEntry(Date operateDate, int tryCount, boolean pinCorrect) { this.operateDate = operateDate; this.tryCount = tryCount; this.pinCorrect = pinCorrect; } // 按需添加getter、setter方法即可 }
// 改造后的UserInfo类 import java.util.ArrayList; import java.util.Date; public class UserInfo { private ArrayList<LogEntry> logList; public UserInfo(){ this.logList = new ArrayList<>(); } public void addLog(Date date,int count, boolean correct) { logList.add(new LogEntry(date, count, correct)); } }
// 改造后的Logger类 import java.util.ArrayList; import java.util.Date; public class Logger { private ArrayList<UserInfo> userInfoList = new ArrayList<>(); public Logger(Date date, int count, boolean correct){ UserInfo userInfo = new UserInfo(); userInfo.addLog(date, count, correct); userInfoList.add(userInfo); } }
如果确实需要用同一个集合存储不同类型的原始值(不推荐,取值时需要手动强转容易出错),可以将集合泛型指定为Object:
import java.util.ArrayList; import java.util.Date; public class UserInfo { private ArrayList<Object> values; public UserInfo(){ this.values = new ArrayList<>(); } public void setValue(Date date,int count, boolean correct) { // 单次add只能存入一个元素,分三次调用 values.add(date); values.add(count); values.add(correct); } }
内容的提问来源于stack exchange,提问作者Matt Beagle
相关产品推荐
相关产品推荐

