为了账号安全,请及时绑定邮箱和手机立即绑定

具有多态性的通用数组

具有多态性的通用数组

手掌心 2021-08-04 17:00:55
我创建了一个由一些对象实现的基本接口,我还有一个接口数组,它给出一个字符串返回提到的对象。(有点难以解释,最好看看代码: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)方法
查看完整描述

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 方法(我没有重写你的循环,因为我不确定我是否正确地使用它,但希望你可以自己应用它)。


查看完整回答
反对 回复 2021-08-04
?
米脂

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.

}


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信