我创建了一个基本接口,该接口由某些对象实现,并且我还有一个接口数组,给定一个字符串返回所提到的对象。 (有点难以解释,最好看一下代码:D)然后,我想通过一些重载的方法将其传递给全局对象(一开始看起来很聪明,但现在看来在技术上是不可能的)我要吗?
interface Stats { }
public class ObjectA implements Subscriber.Stats { // MORE THINGS }
public class ObjectB implements Subscriber.Stats { // MORE THINGS }
// MORE OBJECTS
这是第二个接口,可将字符串从上面转换为一个类
public interface Parser<T extends Stats> {
T parse(String data);
}
现在我有此接口的一系列实现,我想给我不同的结果(ObjectA,ObjectB,ObjectC ..)
private final Parser<Stats>[] parsers = new Parser[] {
new Parser() {
@Override
public Stats parse(String data) {
return new ObjectA();
}
},
new Parser() {
@Override
public Stats parse(String data) {
return new ObjectB();
}
}
};
现在出现了“聪明”部分,我想在其中做一些不可能的事情。
如果我循环遍历 parsers 的数组,并且每个位置都给我ObjectA和ObjectB,则由于多态性,我可以调用带有push(ObjectA)
{{1}这样的签名的类的重载方法},对吗?... 这显然行不通,但是我有什么策略可以用来实现这一目标?
循环将是:
push(ObjectB)
已编辑
问题在于方法for (int i = 0; i < operations.length; i++) {
dataHolder.push(parsers[i].parse(operations[i].getResult()));
}
被视为返回T parse (String value)
而不是返回Stats
,因此,当我调用T extends Stats
时,它说没有push
方法>
答案 0 :(得分:0)
如果我正确理解它,那么您的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);
它将使用适当的重载push方法(我没有重写您的循环,因为我不确定我是否正确松开了它,希望您可以自己应用它)。
答案 1 :(得分:-2)
对我来说合理的声音。试试吧。
+----+------+-----------+----------+--------------+----------+----------+----------+----------+----------+
| ID | Name | StartDate | Orig_Fee | IncreaseDate | Fee_2018 | Fee_2019 | Fee_2020 | Fee_2021 | Fee_2022 |
+----+------+-----------+----------+--------------+----------+----------+----------+----------+----------+
| 23 | PEN | 1/8/2018 | 65 | 01/12/2018 | 69.55 | 74.41 | 79.62 | 85.20 | 91.16 |
| 33 | PEL | 2/6/2018 | 100 | NULL | 100.00 | 100.00 | 100.00 | 100.00 | 100.00 |
+----+------+-----------+----------+--------------+----------+----------+----------+----------+----------+
您还可以:
String dataToParse = "wklhbglbwbgiwegbuwegbwe";
for(Parser p : parsers){
//The definition of each parser will be called and everything works.
System.out.println(p.parse(dataToParse));
}