使用工厂方法创建泛型

时间:2014-11-24 14:28:43

标签: java generics collections interface factory-method

我有一个带有通用集合(Flavors)的抽象类(Candy)。 Candy有一种工厂方法来生产自己的具体实例。它还有一些方法可以获得适合混凝土糖果的通用香味的实例,并为其集合添加香味。

我知道吸气剂正在工作,因为如果我从CandyStore中榨出味道,那么混凝土味道独有的方法就可以了。但是最后一行,addFlavor(风味),错误(Eclipse)在我身上。错误是:" ICandy类型中的方法addFlavor(捕获#5-of?扩展IFlavor)不适用于参数(IFlavor)。"谁能解释一下发生了什么?

界面:

public interface ICandy <Flavor extends IFlavor> {
    public Flavor getFlavorForCandy();
    public void addFlavor(Flavor flavor);
}

抽象类:

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
    }
}

具体类:

public class JolRanchCandy extends AbstractCandy<JolRanchFlavor> {
    ... //implemented
}

使用者:

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
    }
}

修改:为清晰起见,JolRanchFlavor extends CandyFlavor implements IJolRanchFlavorCandyFlavor implements IFlavor

1 个答案:

答案 0 :(得分:0)

试试这个......

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

问题是private ICandy<? extends IFlavor> candy的声明。由于糖果的类型未知,因此?编译器并不确切知道IFlavor addFlavor应该采用何种类型。您只需要为IFlavor类型定义通用持有者,以便保留它。