我试图将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 回答
![?](http://img1.sycdn.imooc.com/5458471300017f3702200220-100-100.jpg)
慕田峪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();
}
![?](http://img1.sycdn.imooc.com/533e4c5600017c5b02010200-100-100.jpg)
慕标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();
}
}
添加回答
举报
0/150
提交
取消