簡體   English   中英

擴展/實現這些接口所需的泛型?

[英]Generics needed to extend/implement these interfaces?

我正在嘗試設計接口和類來解析pcap格式文件中的某些類型的數據包。 (我知道存在特殊的庫,但是我需要自己做)

所以我有一個分類器接口,該方法將檢查它是否為有效數據包。

public interface Classifier {
    boolean classify (PcapPacket 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 {

但現在我有難處,以貫徹BParser上的頂部AParser考慮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;
}

粗體行給出編譯錯誤。 至此,我知道我的方法有問題。 定義接口時,可能需要使用泛型。

您將如何幫助我重新設計此代碼,以使其在將來發揮作用並具有靈活性?

是的,泛型和子類不能很好地協同工作。 您已經聲明了解析器(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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM