gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:05:13 24 4
gpt4 key购买 nike

我正在尝试将抽象工厂模式与有界类型参数一起使用,示例如下:

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, etc)

public class XxxCageFactory implements CageAbstractFactory {
@Override
public Cage<Xxx> createCage() {
return new XxxCage();
}
}

Cage.java

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, etc)

public class XxxCage extends Cage<Xxx> {
@Override
public void add(Xxx r) {
cage.add(r);
}
}

Animal.java

public class Animal {
public String toString() {
return getClass().getSimpleName();
}

}

class Rat extends Animal {}
class Lion extends Animal {}

AFP.java (Main class)

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())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 的选择决定作为参数传递的类(即 LionCageFactoryRatCageFactory )

最佳答案

不要使用通配符?

public static Cage<?> getCage(CageAbstractFactory factory) {
return factory.createCage();
}

但使用通用

public static <T extends Animal> Cage<T> getCage(CageAbstractFactory factory) {
return factory.createCage();
}

关于java - 如何使用具有有界类型参数的抽象工厂模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50947497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com