首页 > 解决方案 > 如何仅根据java中赋值的类型来决定选择哪个函数

问题描述

我有以下课程

public class MyItems {
    ItemA myItemA1 = new ItemA();
    ItemA myItemA2 = new ItemA();
    ItemB myItemB1 = new ItemB();
}

是否可以实现一个 Factory/Creator 类,以便该类可以更改为:

public class MyItems {
    ItemA myItemA1 = Factory.create();
    ItemA myItemA2 = Factory.create();
    ItemB myItemB1 = Factory.create();
}

或者也许

public class MyItems {
    ItemA myItemA1 = Factory.create<>();
    ItemA myItemA2 = Factory.create<>();
    ItemB myItemB1 = Factory.create<>();
}

我正在考虑列表的分配:

    List<String> list = new ArrayList<>();

您也只有右侧的钻石。

注意:如有必要,您可以将泛型引入ItemX对象

标签: javagenerics

解决方案


您正在尝试做的事情可能会像

ItemA myItemA1 = (ItemA) Factory.create<ItemA>();

或者

ItemB myItemB1 = Factory.createItemB();

因为如前所述,Factory 无法猜测要返回的类型(它甚至无法返回不同的类型,因此强制转换是必要的)。如果你能想出一些逻辑来让工厂在 100% 的时间内猜测返回类型,那么类似的东西ItemA myItemA1 = (ItemA) Factory.create()可能会起作用,但它绝对会破坏代码的可读性,所以不要这样做。

这个问题有一个实例,在哪里Factory.create()可以毫无问题地实现:当所有ItemX-Types 都是接口时。在这种情况下,您可以创建一个类

public class ItemGeneric implements ItemA, ItemB, ItemC {
     //implementation off all three interfaces here
}

并让您的工厂总是返回一个ItemGeneric.


推荐阅读