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

如何使用有界类型参数的抽象工厂模式?

如何使用有界类型参数的抽象工厂模式?

函数式编程 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条经验 获得超7个赞

不要使用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 关注
  • 160 浏览

添加回答

举报

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