Java 使用工厂方法创建泛型

Java 使用工厂方法创建泛型,java,generics,collections,interface,factory-method,Java,Generics,Collections,Interface,Factory Method,我有一个抽象类(Candy)和一个通用集合(Flavors)。Candy有一个工厂方法来生成自己的具体实例。它还提供了一些方法来获取适合于具体糖果的通用风味实例,并将该风味添加到其集合中 我知道吸气剂在起作用,因为如果我从烛台上浇铸香精,混凝土香精特有的方法会很好地发挥作用。但是最后一行,addFlavor(flavor),errs(Eclipse)在我身上。错误是:“类型ICandy中的方法addFlavor(capture#5-of?扩展IFlavor)不适用于参数(IFlavor)。”有人

我有一个抽象类(Candy)和一个通用集合(Flavors)。Candy有一个工厂方法来生成自己的具体实例。它还提供了一些方法来获取适合于具体糖果的通用风味实例,并将该风味添加到其集合中

我知道吸气剂在起作用,因为如果我从烛台上浇铸香精,混凝土香精特有的方法会很好地发挥作用。但是最后一行,addFlavor(flavor),errs(Eclipse)在我身上。错误是:“类型ICandy中的方法addFlavor(capture#5-of?扩展IFlavor)不适用于参数(IFlavor)。”有人能解释发生了什么吗

接口:

public interface ICandy <Flavor extends IFlavor> {
    public Flavor getFlavorForCandy();
    public void addFlavor(Flavor flavor);
}
公共接口ICandy{
公共风味getFlavorForCandy();
公共风味(香精风味);
}
抽象类:

public abstract class AbstractCandy<Flavor extends IFlavor> implements ICandy<Flavor> {
    public static ICandy<? extends IFlavor> buildCandy(String flavor){
        if(flavor.equals("Jolly Rancher")
            return new JolRanchCandy();
    }
    public Flavor getFlavorForCandy() {
        return (Flavor) new CandyFlavor();
    }
    public void addFlavor(Flavor flavor) {
        ... //implemented
    }
}
公共抽象类abstractdy{
公共静态ICandy试试这个

public <T extends IFlavor> void createCandy() {
    ICandy<T> candy= (ICandy<T>) AbstractCandy.buildCandy("Jolly Rancher");
    T flavor= candy.getFlavorForCandy(); 
    flavor.setName("Apple");            
    candy.addFlavor(flavor);  
}
public void createCandy(){
ICandy candy=(ICandy)AbstractCandy.buildCandy(“快乐的牧场主”);
T flavor=candy.getFlavorForCandy();
香精。设置名称(“苹果”);
糖果。添加风味(香精);
}

问题是您所声明的
private的声明ICandy@LuiggiMendoza你的建议的问题是,
addFlavor
采用了一个具体的实例
Flavor
,而不是
IFlavor
@JohnB,这种方法的问题是……另一个例子,
List number=new ArrayList();Number.add(new Integer(5));
编译和运行没有问题。但是
Number
是一个
Integer
匹配的接口。请注意,
addFlavor
采用
Flavor
这不是一个接口,而是类的泛型。例如
ICandy
[与下面的答案相同的评论]这是因为您需要
jollanchandy
重写
getFlavorForCandy
以返回
jollanchFlavor
的实例,因为默认实现返回一个
CandyFlavor
。谢谢您的回答。这种方法可以将我的所有味道类型更改为IFlavor。两者的问题是当我要使用其独特的方法,我得到“java.lang.ClassCastException:CandyFlavor与JollanchFlavor不兼容”。(这可能需要一个新问题?)这是因为您需要
JollanchCandy
重写
getFlavorForCandy
以返回
JollanchFlavor
的实例,因为默认实现返回一个
CandyFlavor
。上面的问题是,如果此方法只能生成
JollanchCandy
,那么
candy
应该是类型de>JollanchCandy
。如果你想说的话,那么把这个方法变成泛型是没有意义的,但是等一下,我知道这是什么。明白了。这就是我希望避免泛型的原因,因为所有的
Candy
s都会返回一个
CandyFlavor
IFlavor
)具体到他们自己的实现。CandyStore有一种硬编码的方法来区分要转换到什么(从另一个系统,我无法控制)。是的,还有更多不同的
Candy
s,而不仅仅是一个。
public class CandyStore {
    private ICandy<? extends IFlavor> candy;
    private IFlavor flavor;
    public void createCandy() {
        candy = AbstractCandy.buildCandy("Jolly Rancher");
        flavor = candy.getFlavorForCandy(); //returns a JolRanchFlavor
        flavor.setName("Apple");            //etc for creating flavor
        candy.addFlavor(flavor);   //no luck
    }
}
public <T extends IFlavor> void createCandy() {
    ICandy<T> candy= (ICandy<T>) AbstractCandy.buildCandy("Jolly Rancher");
    T flavor= candy.getFlavorForCandy(); 
    flavor.setName("Apple");            
    candy.addFlavor(flavor);  
}