[英]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.