第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

具有多態(tài)性的通用數(shù)組

具有多態(tài)性的通用數(shù)組

手掌心 2021-08-04 17:00:55
我創(chuàng)建了一個(gè)由一些對(duì)象實(shí)現(xiàn)的基本接口,我還有一個(gè)接口數(shù)組,它給出一個(gè)字符串返回提到的對(duì)象。(有點(diǎn)難以解釋,最好看看代碼:D)然后我想通過一些重載方法將它傳遞給全局對(duì)象(一開始看起來非常聰明,但現(xiàn)在技術(shù)上似乎不可能)我能更接近什么嗎?我想要?interface Stats { }public class ObjectA implements Subscriber.Stats { // MORE THINGS }public class ObjectB implements Subscriber.Stats { // MORE THINGS }// MORE OBJECTS這是將 String 轉(zhuǎn)換為上面的類之一的第二個(gè)接口public interface Parser<T extends Stats> {    T parse(String data);}現(xiàn)在我有了這個(gè)接口的一系列實(shí)現(xiàn),我想給我不同的結(jié)果(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();            }        }};現(xiàn)在是“聰明”的部分,我想做一些可能不可能的事情。如果我循環(huán)解析器數(shù)組,并且由于多態(tài)性,每個(gè)位置都給我 ObjectA,ObjectB,我可以調(diào)用類的重載方法,其簽名為push(ObjectA) push(ObjectB),對(duì)吧??...好吧,這顯然行不通,但有什么策略我可以用它來完成這個(gè)嗎?循環(huán)將是:for (int i = 0; i < operations.length; i++) {                   dataHolder.push(parsers[i].parse(operations[i].getResult()));}已編輯 的問題是該方法T parse (String value)被視為它返回Stats而不是T extends Stats因此當(dāng)我調(diào)用push它時(shí)說沒有push(Stats)方法
查看完整描述

2 回答

?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊

如果我理解正確,您的 dataHolder 界面如下所示:


public interface DataHolder {

    void push(ObjectA a);

    void push(ObjectB b);

}

在這種情況下,您的循環(huán)確實(shí)無法從重載方法中受益,因?yàn)樵诰幾g時(shí),它只知道Stats.


為了實(shí)現(xiàn)您的目標(biāo),您需要使用訪問者模式,并Stats像這樣更新您的層次結(jié)構(gòu):


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

    }

}

現(xiàn)在如果你這樣做:


new Parser<Stat>().parse(input).accept(dataHandler);

它將使用 propper 重載 push 方法(我沒有重寫你的循環(huán),因?yàn)槲也淮_定我是否正確地使用它,但希望你可以自己應(yīng)用它)。


查看完整回答
反對(duì) 回復(fù) 2021-08-04
?
米脂

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊

對(duì)我來說聽起來很合理。去嘗試一下。


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.

}


查看完整回答
反對(duì) 回復(fù) 2021-08-04
  • 2 回答
  • 0 關(guān)注
  • 162 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)