gpt4 book ai didi

Java:接口(interface)和工厂中的泛型

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:31 26 4
gpt4 key购买 nike

我有一个基类 Plant,其中有两个子类型路径。Fruit extends PlantVegetable extends Plant.FruitVegetable 也是抽象类,然后它们还有其他类,如 Banana extends FruitSpinach extends Vegetable .

现在让我们举个例子,一个操作必须通过这些类进行操作,并且有一个操作接口(interface)。目前的设计如下:

我有一个界面:

abstract class Plant {}
abstract class Fruit extends Plant {}
class Banana extends Fruit {}

public interface PlantWeigher<T extends Plant> {
public int weight(T fruit);
}

然后我有:

public abstract class FruitWeigher<Y extends Fruit> implements PlantWeigher<Y> { }

然后我有具体的类:

public class BananaWeigher extends FruitWeigher<Banana> {
public int weight(Banana fruit);
}

现在,作为刚刚了解Plant的用户,我想获取正确的Weigher实例,然后进行操作。

所以Factory是这样的:

public class WeigherFactory {    
public static PlantWeigher<? extends Plant> getInstance(Plant plant){
// based on some logic on Plant argument, I return, lets say:
return new BananaWeigher();
}
}

所以在用户类中,我调用了下面的函数:

PlantWeigher<? extends Plant> instance = WeigherFactory.getInstance(userPlant);
instance.weight(plant); // THIS LINE GIVES AN ERROR

有人可以帮助我理解这里的设计有什么问题,也有人可以建议解决方案。

谢谢。

最佳答案

行:

 PlantWeigher<? extends Plant> instance = WeigherFactory.getInstance(userPlant);

的意思是,“我有一个称重器,可以称重 Plant 的一些子类,而不是所有种类的植物”。例如,如果工厂返回一个 BananaWeigher,尝试用它称重 Tomato 就没有意义。要实现您想要的效果,您应该按如下方式更改工厂:

public class WeigherFactory{

public static <P extends Plant> PlantWeigher<P> getInstance(P plant){
// should return a correct Weigher for the subttype of Plant P
return ...
}
}

然后调用代码将返回如下:

 PlantWeigher<Banana> instance =WeigherFactory.getInstance(banana);
instance.weigh(banana)

现在您有一个特定的PlantWeigher,您可以用特定的类型调用它

,如果您希望能够使用任何类型的PlantWeigher 称量任何类型的Plant,则应更改后者:

 public interface PlantWeigher {
public int weight(Plant p);
}

这确保 PlantWeigher 可以对任何计划进行加权,无论是否有意义。

关于Java:接口(interface)和工厂中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32199509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com