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

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

如何使用有界類型參數的抽象工廠模式?

如何使用有界類型參數的抽象工廠模式?

函數式編程 2021-04-02 18:19:35
我試圖將Abstract Factory Pattern與有界的類型化參數一起使用,示例如下:CageAbstractFactory.javapublic interface CageAbstractFactory {    public Cage<?> createCage();}CageFactory.javapublic class CageFactory {    public static Cage<?> getCage(CageAbstractFactory factory) {        return factory.createCage();    }}XxxCageFactory.java(Xxx = Lion,Rat等)public class XxxCageFactory implements CageAbstractFactory {    @Override    public Cage<Xxx> createCage() {        return new XxxCage();    }}籠子public abstract class Cage<T extends Animal> {     protected Set<T> cage = new HashSet<T>();    public abstract void add(T animal);    public void showAnimals() {        System.out.println(cage);    }}XxxCage.java(Xxx = Lion,Rat等)public class XxxCage extends Cage<Xxx> {    @Override    public void add(Xxx r) {        cage.add(r);    }}動物.javapublic class Animal {    public String toString() {        return getClass().getSimpleName();    }   }class Rat extends Animal {}class Lion extends Animal {}AFP.java(主類)public class AFP {    public static void main(String[] args) {        Cage<?> rc = CageFactory.getCage(new RatCageFactory());        Cage<?> lc = CageFactory.getCage(new LionCageFactory());        rc.add(new Rat());        rc.showAnimals();        lc.add(new Lion());    }}在第rc.add(new Rat())OR行或rc.add(new Lion())以下錯誤出現:The method add(capture#3-of ?) in the type Cage<capture#3-of ?> is not applicable for the arguments (Rat)似乎從Cage<?>到Cage<Rat>/的類型轉換錯誤Cage<Lion>但是問題是CageFactory.getCage(CageAbstractFactory factory)返回Cage<?>是僅在運行時通過選擇CageAbstractFactory作為參數傳遞的類(即LionCageFactoryOR RatCageFactory)來決定的。
查看完整描述

2 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

不要使用wildcard ?作為


public static Cage<?> getCage(CageAbstractFactory factory) {

    return factory.createCage();

}

但是使用通用


public static <T extends Animal> Cage<T> getCage(CageAbstractFactory factory) {

    return factory.createCage();

}


查看完整回答
反對 回復 2021-04-18
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

您還需要對進行概括CageAbstractFactory:


public interface CageAbstractFactory<T> {

    public Cage<T> createCage();

}


public class CageFactory {

    public static <T> Cage<T> getCage(CageAbstractFactory<T> factory) {

        return factory.createCage();

    }

}


public class XxxCageFactory implements CageAbstractFactory<Xxx> {

    @Override

    public Cage<Xxx> createCage() {

        return new XxxCage();

    }

}


查看完整回答
反對 回復 2021-04-18
  • 2 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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