0

我正在尝试设计接口和类来解析 pcap 格式文件中的某些类型的数据包。(我知道存在特殊的库,但我需要自己做)

所以我有一个分类器接口,该方法会检查它是否是一个有效的数据包。

public interface Classifier {
    boolean classify (PcapPacket pcapPacket);
}

解析器接口的方法会将内部的字节数组PcapPacket转换为一些字段。P代表新解析的数据包和S统计信息。

public interface Parser<P, S> extends Classifier {
    P parsePacket (PcapPacket pcapPacket);
    P parsePacket (PcapPacket pcapPacket, P outPacket);
    S parseReader (PcapReader pcapReader);
}

现在我已经实现AParser了它可以解析某个数据包或文件。

public class AParser implements Parser<APacket, AStats>, Classifier {

但是现在我很难BParserAParser考虑到这一点的基础上实施BPacket extends APacket

public class BParser extends AParser implements Parser<BPacket, BStats> {

parsePacket我想做这样的事情:

BPacket parsePacket (PcapPacket pcapPacket) {
    APacket apacket = super.parse(pcapPacket);
    BPacket bpacket = new BPacket(apacket);

    //extract val1 and val2 from pcapPacket
    bpacket.set(val1, val2);
    return bpacket;
}

粗体线给出编译错误。在这一点上,我明白我的方法有问题。可能,我在定义接口时需要使用泛型。

您将如何帮助我重新设计此代码以使其在未来工作和灵活?

4

1 回答 1

1

是的,泛型和子类不能以这种方式很好地协同工作。您已经声明了解析器 (AParser) 的特化,它将其通用参数绑定到给定对象 (APacket)。然后,您不能使用一组不同的通用参数扩展此专业化。就像您正在尝试这样做:

public class BParser implements Parser<APacket, AStats>, Parser<BPacket, BStats> {

这不起作用,因为类型擦除意味着您有一堆方法可以转换为相同的签名。一个更可行的解决方案是将专用解析器的通用功能推入一个抽象基类,该基类不会将泛型参数绑定到特定类型。用伪代码说明:

public abstract class BaseParser<P, S> implements Parser<P, S> {
    // common functionality here
}

public class AParser extends BaseParser<APacket, AStats> {
    // functionality specific to AParser
}

public class BParser extends BaseParser<BPacket, BStats> {
    // functionality specific to BParser
}
于 2013-03-12T05:40:10.527 回答