List泛型使用报错求助:add方法参数不匹配问题
解决List<?>调用add方法的编译错误问题
错误原因
List<?>是无界通配符类型,编译器无法确定该列表实际存储的元素类型,因此禁止向其中添加除null之外的任何元素。即便你在代码逻辑中已经给变量赋值了具体类型的ArrayList,但变量pairs的静态类型仍是List<?>,编译器会严格按照静态类型做检查,导致add操作触发编译错误。
解决方案
核心思路是:在每个分支中使用具体类型的List变量执行元素添加操作,最后再将其赋值给List<?>类型的变量返回。这样既满足分支内的类型安全操作,又符合方法返回List<?>的要求。
修改后的代码如下:
public List<?> readDataPairs(boolean processReturn) throws IOException { List<?> pairs = null; if (processReturn) { // 使用具体类型List<DataPair>操作元素 List<DataPair> dataPairList = new ArrayList<>(); try (RandomAccessFile raf = new RandomAccessFile(WriteFile.dataPairFileName, "r")) { long fileLength = raf.length(); long bytesRead = 0; while (bytesRead < fileLength) { int recordCount = raf.readInt(); bytesRead += 4; for (int i = 0; i < recordCount; i++) { ByteBuffer bb = ByteBuffer.allocate(bytesPerDataPage); raf.read(bb.array()); bb.rewind(); DataPair dataPair = SerializeAndVers.deserializeDataPair(bb); dataPairList.add(dataPair); // 操作具体类型List,无编译错误 } bytesRead += bytesPerDataPage; } } pairs = dataPairList; } else { // 使用具体类型List<DataPagePair>操作元素 List<DataPagePair> pagePairList = new ArrayList<>(); try (RandomAccessFile raf = new RandomAccessFile(WriteFile.dataPairFileName, "r")) { long fileLength = raf.length(); long bytesRead = 0; int pageCount = 0; while (bytesRead < fileLength) { int recordCount = raf.readInt(); bytesRead += 4; pageCount++; for (int i = 0; i < recordCount; i++) { ByteBuffer bb = ByteBuffer.allocate(bytesPerDataPage); raf.read(bb.array()); bb.rewind(); DataPair dataPair = SerializeAndVers.deserializeDataPair(bb); pagePairList.add(new DataPagePair(dataPair.getKey(), pageCount)); // 操作具体类型List,无编译错误 } bytesRead += bytesPerDataPage; } } pairs = pagePairList; } return pairs; }
补充说明
- 若想避免调用方处理
List<?>的不便,可考虑将方法拆分为两个独立方法:readDataPairList()和readDataPagePairList(),分别返回List<DataPair>和List<DataPagePair>,进一步提升代码可读性与类型安全性。 - 无界通配符
List<?>更适合只读场景,如果需要对列表执行写操作,应优先使用具体类型或有界通配符(如List<? super T>)。
内容的提问来源于stack exchange,提问作者Constantinos Pisimisis
相关产品推荐
相关产品推荐

