具有多态性的通用数组

时间:2018-08-21 19:36:11

标签: java generics

我创建了一个基本接口,该接口由某些对象实现,并且我还有一个接口数组,给定一个字符串返回所提到的对象。 (有点难以解释,最好看一下代码: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方法

2 个答案:

答案 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));
}