我尝试使用一个方法(称为readdataPairs),并基于一个布尔值,我想返回正确的列表。问题是,我得到了一个错误,我不知道如何修复它。它说:
“类型List〈capture#2-of?〉中的方法add(capture#2-of?)不适用于参数(DataPair)”
我的代码是:
public List<?> readDataPairs(boolean processReturn) throws IOException {
List<?> pairs = null;
if (processReturn) {
pairs = new ArrayList<DataPair>();
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);
pairs.add(SerializeAndVers.deserializeDataPair(bb));
} //compiler's error
bytesRead += bytesPerDataPage;
}
}
} else {
pairs = new ArrayList<DataPagePair>();
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);
pairs.add(new DataPagePair(dataPair.getKey(), pageCount)); //compiler's error
}
bytesRead += bytesPerDataPage;
}
}
}
return pairs;
}
用于序列化和版本的类如下所示:
public class SerializeAndVers {
public static ByteBuffer serializeDataPair(DataPair dataPair) {
int stringLength = dataPair.getString().length();
ByteBuffer bb = ByteBuffer.allocate(8 + stringLength);
bb.putInt(dataPair.getKey());
bb.putInt(stringLength);
bb.put(dataPair.getString().getBytes(StandardCharsets.US_ASCII));
bb.flip();
return bb;
}
public static DataPair deserializeDataPair(ByteBuffer bb ) {
int key = bb.getInt();
int stringLength = bb.getInt();
byte[] stringBytes = new byte[stringLength];
bb.get(stringBytes, 0, stringLength);
String string = new String(stringBytes, StandardCharsets.US_ASCII);
return new DataPair(key, string);
}
}
任何帮助都是有用的。
另外,我也用了addAll
,但也不起作用。
2条答案
按热度按时间zzlelutf1#
List<?>
的意思是“一个列表,但我不知道它能包含什么和不能包含什么”。由于列表中包含未知类型,因此不允许向其中添加任何内容,因为无法确定它是否是正确的类型(唯一的例外是
null
,因为无论实际类型参数是什么,它都是有效的)。如果你做了这样的事
作为程序员,您知道这是一个
DataPair
的列表,但Java不知道,因为变量的类型才是重要的,而不是它初始化为什么。您的主要选择(这不会引入不必要的类型不安全性)可能是编写...
或者...
cl25kdpy2#
您可以定义:
因此,出现了错误
capture#2-of ?
,因为对的类型设置为List<?>
。与捕获的不符所以
1 -不要在此用例中使用泛型。
2 -为
DataPair
和DataPagePair
创建一个“公共”接口,假设Pair
并将其声明为