2 回答

TA貢獻1815條經驗 獲得超6個贊
如果我理解正確,您的 dataHolder 界面如下所示:
public interface DataHolder {
void push(ObjectA a);
void push(ObjectB b);
}
在這種情況下,您的循環確實無法從重載方法中受益,因為在編譯時,它只知道Stats.
為了實現您的目標,您需要使用訪問者模式,并Stats像這樣更新您的層次結構:
public interface Stats {
void accept(DataHolder holder);
}
public class ObjectA implements Stats {
void accept(DataHolder holder) {
holder.push(this); // this is ObjectA, so push(ObjectA) is used
}
}
public class ObjectB implements Stats {
void accept(DataHolder holder) {
holder.push(this); // this is ObjectB, so push(ObjectB) is used
}
}
現在如果你這樣做:
new Parser<Stat>().parse(input).accept(dataHandler);
它將使用 propper 重載 push 方法(我沒有重寫你的循環,因為我不確定我是否正確地使用它,但希望你可以自己應用它)。

TA貢獻1836條經驗 獲得超3個贊
對我來說聽起來很合理。去嘗試一下。
String dataToParse = "wklhbglbwbgiwegbuwegbwe";
for(Parser p : parsers){
//The definition of each parser will be called and everything works.
System.out.println(p.parse(dataToParse));
}
你也可以:
public void push(Object obj){
System.out.println(obj.getClass().getCardionalName());
//Or anything else you want to do with it.
}
添加回答
舉報