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