0

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

我知道 getter 正在工作,因为如果我从 CandyStore 投射风味,则具体风味独特的方法可以正常工作。但是最后一行,addFlavor(flavor), errs (Eclipse) 在我身上。错误是:“ICandy 类型中的方法 addFlavor(capture#5-of ? extends 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.

4

1 回答 1

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类型定义一个通用持有者,以便保留它。

于 2014-11-24T14:37:22.540 回答