我有一个带有通用集合(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 IJolRanchFlavor
和CandyFlavor implements IFlavor
。
答案 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
类型定义通用持有者,以便保留它。