亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有多態性的通用數組

具有多態性的通用數組

手掌心 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 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號