具有多态性的通用数组

我创建了一个由一些对象实现的基本接口,我还有一个接口数组,它给出一个字符串返回提到的对象。(有点难以解释,最好看看代码:D)然后我想通过一些重载方法将它传递给全局对象(一开始看起来非常聪明,但现在技术上似乎不可能)我能更接近什么吗?我想要?


interface Stats { }


public class ObjectA implements Subscriber.Stats { // MORE THINGS }


public class ObjectB implements Subscriber.Stats { // MORE THINGS }


// MORE OBJECTS

这是将 String 转换为上面的类之一的第二个接口


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();

            }

        }

};

现在是“聪明”的部分,我想做一些可能不可能的事情。


如果我循环解析器数组,并且由于多态性,每个位置都给我 ObjectA,ObjectB,我可以调用类的重载方法,其签名为push(ObjectA) 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它时说没有push(Stats)方法


手掌心
浏览 142回答 2
2回答

红糖糍粑

如果我理解正确,您的 dataHolder 界面如下所示:public interface DataHolder {&nbsp; &nbsp; void push(ObjectA a);&nbsp; &nbsp; void push(ObjectB b);}在这种情况下,您的循环确实无法从重载方法中受益,因为在编译时,它只知道Stats.为了实现您的目标,您需要使用访问者模式,并Stats像这样更新您的层次结构:public interface Stats {&nbsp; &nbsp; void accept(DataHolder holder);}public class ObjectA implements Stats {&nbsp; &nbsp; void accept(DataHolder holder) {&nbsp; &nbsp; &nbsp; &nbsp; holder.push(this); // this is ObjectA, so push(ObjectA) is used&nbsp; &nbsp; }}public class ObjectB implements Stats {&nbsp; &nbsp; void accept(DataHolder holder) {&nbsp; &nbsp; &nbsp; &nbsp; holder.push(this); // this is ObjectB, so push(ObjectB) is used&nbsp; &nbsp; }}现在如果你这样做:new Parser<Stat>().parse(input).accept(dataHandler);它将使用 propper 重载 push 方法(我没有重写你的循环,因为我不确定我是否正确地使用它,但希望你可以自己应用它)。

米脂

对我来说听起来很合理。去尝试一下。String dataToParse = "wklhbglbwbgiwegbuwegbwe";for(Parser p : parsers){&nbsp; &nbsp; //The definition of each parser will be called and everything works.&nbsp; &nbsp; System.out.println(p.parse(dataToParse));}你也可以:public void push(Object obj){&nbsp; &nbsp; System.out.println(obj.getClass().getCardionalName());&nbsp; &nbsp; //Or anything else you want to do with it.}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java