簡體   English   中英

我可以在Java中重載接口方法嗎?

[英]Can I overload an interface method in Java?

我有一個數據描述界面:

public interface DataDescription {
     int getId();
}

兩個實現:

public class DataWithId1 implements DataDescription {
    // ... simple getter impl.
}

public class OtherDataWithId implements DataDescription {
    // ... simple getter impl.
}

現在我有這個界面:

public interface DataProcessor {
    void process(DataDescription data);
}

我想用一個類實現DataProcessor ,如下所示:

public class DataProcessorImpl implements DataProcessor {
    @Override
    public void process(DataDescription data) {
        // Do something...
    }

    public void process(DataWithId1 data) {
        // Do something specific with this type (e.g. directly store in table of database)
    }

    public void process(OtherDataWithId data) {
        // Do something specific with this type (convert to format DataWithId1 and then store in DB)
    }
}

還有一些代碼可以調用它:

public Main {
    private DataProcessor dataProcessor = new DataProcessor();

    public static void main(String[] args) {
        DataDescription data = new DataWithId1(1);
        dataProcessor.process(data);
    }
}

我想要實現的是DataProcessor調用者不必擔心數據轉換(他們有一個DataDescription ,不必知道這兩種類型)。 另外我想避免代碼的instanceof

我做的假設是我可以重載這樣的接口方法。 在查看java語言規范的第15.12節時,我無法找到證據(這並不意味着它不存在......)。

我對重載的假設是否正確? 我可以避免使用instanceof嗎?

不,這不行。

您的代碼中沒有重載。 dataProcessor的靜態類型是DataProcessor ,而DataProcessor只有一個process方法。

如果將dataProcessor的靜態類型更改為DataProcessorImpl ,則仍然無法獲得所需的結果,因為在編譯時確定了重載分辨率。 因此,由於編譯時data類型是DataDescription ,因此dataProcessor.process(data)仍將調用public void process(DataDescription data)而不是public void process(DataWithId1 data)

也許您正在尋找訪客模式

public interface DataDescription {
    int getId();
    void accept(DataProcessorImpl p);
}

public class DataWithId1 implements DataDescription {
    private final int id;

    public DataWithId1(int id) {
        this.id=id;
    }
    @Override
    public void accept(DataProcessorImpl p) {
        p.process(this);
    }
    @Override
    public int getId() {
        return id;
    }
    // ... simple getter impl.
}

public class OtherDataWithId implements DataDescription {
    private final int id;

    public OtherDataWithId(int id) {
        this.id=id;
    }
    @Override
    public void accept(DataProcessorImpl p) {
        p.process(this);
    }
    @Override
    public int getId() {
        return 42;
    }
    // ... simple getter impl.
}
public interface DataProcessor {
    void process(DataDescription data);
}

public class DataProcessorImpl implements DataProcessor {
    @Override
    public void process(DataDescription data) {
        data.accept(this);
    }

    public void process(DataWithId1 data) {
        System.out.println("process(DataWithId1)");
        // Do something specific with this type
        // (e.g. directly store in table of database)
    }

    public void process(OtherDataWithId data) {
        System.out.println("process(OtherDataWithId)");
        // Do something specific with this type
        // (convert to format DataWithId1 and then store in DB)
    }
}

public class Main {
    private static DataProcessor dataProcessor=new DataProcessorImpl();

    public static void main(String[] args) {
        DataDescription data = new DataWithId1(1);
        dataProcessor.process(data);
        data = new OtherDataWithId(100);
        dataProcessor.process(data);
    }
}

如果在DataDescription界面中將“特定內容”添加到方法中,則很容易做到。

process()方法屬於每個子類型。 你把它放在錯誤的界面。

DataProcessor在每個DataProcessor上調用該方法:

public interface DataDescription {
     void somethingSpecific();
}

多態性做的工作:

public class DataProcessorImpl implements DataProcessor {
    @Override
    public void process(DataDescription data) {
        data.somethingSpecific();  // polymorphism does it for you here
    }
}

您可以使用抽象類來為您處理轉換,或者在接口中使用Java8的默認方法。

只需在界面中為方法添加關鍵字“default”,並為其指定正文。

暫無
暫無

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

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