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

我试图将Abstract Factory Pattern与有界的类型化参数一起使用,示例如下:


CageAbstractFactory.java


public interface CageAbstractFactory {

    public Cage<?> createCage();

}

CageFactory.java


public 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);

    }

}

动物.java


public 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)来决定的。


函数式编程
浏览 161回答 2
2回答

慕田峪9158850

不要使用wildcard ?作为public static Cage<?> getCage(CageAbstractFactory factory) {&nbsp; &nbsp; return factory.createCage();}但是使用通用public static <T extends Animal> Cage<T> getCage(CageAbstractFactory factory) {&nbsp; &nbsp; return factory.createCage();}

慕标5832272

您还需要对进行概括CageAbstractFactory:public interface CageAbstractFactory<T> {&nbsp; &nbsp; public Cage<T> createCage();}public class CageFactory {&nbsp; &nbsp; public static <T> Cage<T> getCage(CageAbstractFactory<T> factory) {&nbsp; &nbsp; &nbsp; &nbsp; return factory.createCage();&nbsp; &nbsp; }}public class XxxCageFactory implements CageAbstractFactory<Xxx> {&nbsp; &nbsp; @Override&nbsp; &nbsp; public Cage<Xxx> createCage() {&nbsp; &nbsp; &nbsp; &nbsp; return new XxxCage();&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java