java 使用List的泛型类型时出现问题

jgovgodb  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(256)

我尝试使用一个方法(称为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,但也不起作用。

zzlelutf

zzlelutf1#

List<?>的意思是“一个列表,但我不知道它能包含什么和不能包含什么”。
由于列表中包含未知类型,因此不允许向其中添加任何内容,因为无法确定它是否是正确的类型(唯一的例外是null,因为无论实际类型参数是什么,它都是有效的)。
如果你做了这样的事

List<?> pairs;
pairs = new ArrayList<DataPair>();
pairs.add(pair);
return pairs;

作为程序员,您知道这是一个DataPair的列表,但Java不知道,因为变量的类型才是重要的,而不是它初始化为什么。
您的主要选择(这不会引入不必要的类型不安全性)可能是编写...

List<DataPair> pairs;
pairs = new ArrayList<DataPair>();
pairs.add(pair);
return pairs;

或者...

List<?> pairs;
List<DataPair> dataPairList = new ArrayList<DataPair>();
pairs = dataPairList;
dataPairList.add(pair);
return pairs;
cl25kdpy

cl25kdpy2#

您可以定义:

List<?> pairs = null;

因此,出现了错误capture#2-of ?,因为对的类型设置为List<?>

pairs.add(SerializeAndVers.deserializeDataPair(bb));

与捕获的不符所以
1 -不要在此用例中使用泛型。

public List readDataPairs(boolean processReturn) throws IOException {
    List pairs = null;
    . . .
    return pairs;
}

2 -为DataPairDataPagePair创建一个“公共”接口,假设Pair并将其声明为

public List<Pair> readDataPairs(boolean processReturn) throws IOException {
    List<Pair> pairs = null;
    . . .
    return pairs;
}

相关问题