当前位置: 首页 > 知识库问答 >
问题:

是否有办法将字符串映射到根据字符串返回不同类型的方法?

怀飞掣
2023-03-14

我想把一个字符串映射到一个构建特定对象的方法,但不一定要从同一个类为每个字符串映射。环顾四周,一个很好的解决方案是有一张地图

然后我有多个类,比如说Object1Builder实现了ObjectBuilder

然后我可以这样构建我的地图:

stringToBuilder = new HashMap<String, ObjectBuilder>(){{
            put(string1, Object1Builder);
            put(string2, Object2Builder);
            put(string3, Object3Builder);
        }};

然后我可以执行Object1 myObject1=stringToBuilder.get(string1)。

问题是,我得到一个错误

参数化类“ObjectBuilder”的原始使用

在IntelliJ中,当我实例化并构造stringToBuilder时,我知道这与在构造映射时没有指定接口ObjectBuilder的泛型有关,但我不知道如何避免这种情况。此外,我对将这些类存储在映射中这一事实不是很满意,我希望我可以通过映射访问它们,而不必在映射中包含整个实例。

你可能已经注意到我对Java和这一切都很陌生,但是请确保我已经尽力了。提前谢谢你:)


共有1个答案

西门正平
2023-03-14

如果没有明确的强制转换,你想要的东西永远不可能实现。原因是映射键(字符串)和值(ObjectBuilder)之间没有直接关系。

如果您可以从字符串切换到使用T值作为映射键,这可以通过一些内部转换来完成。

首先,将地图声明为map

接下来,根据需要初始化它。我不喜欢使用带有初始值设定项的匿名类,所以我将使用Map。属于

Map<Class<?>, ObjectBuilder<?>> classToBuilder = Map.of(
        Object1.class, Object1Builder,
        Object2.class, Object2Builder,
        Object3.class, Object3Builder,
);

最后,我们需要一种方法来获取生成器:

@SuppressWarnings("unchecked")
private <T> getBuilder(Class<T> type) {
    // Omitted: presence check
    return (ObjectBuilder<T>) classToBuilder.get(type);
}

现在可以按如下方式使用:

Object1 object1 = getBuilder(Object1.class).buildObject();

 类似资料:
  • 我正在编写一个JSON接口/库,用于Bugzilla的webservice。 这可以使用注释或其他内容吗?还是要为每个这样的实例编写一个自定义反序列化程序? 我试着做了一些研究,发现了一些关于值实例化器或使用构造函数的信息,但使用构造函数不是反bean吗?我发现新特性的文档很少或难以理解。 示例: 我对一个字段使用pojo的原因是,这个用户类是由另一个具有更多字段的用户类扩展的。虽然我可以实现一个

  • 我对编码非常陌生,刚刚接触过静态方法,所以我为这些愚蠢的错误提前道歉。在main下调用该方法时,该方法应该显示一个三角形,但我得到的控制台是空的,没有输出。但是,如果我将此写在main下: 然后,三角形将显示在控制台中,但是对于这个赋值,字符串/三角形必须仅通过使用来调用

  • 本文向大家介绍PHP判断一个字符串是否是回文字符串的方法,包括了PHP判断一个字符串是否是回文字符串的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP判断一个字符串是否是回文字符串的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。

  • 这个问题不难,我已经用自己的方法解决了,但我想听听你的意见,也许有什么方法可以让这成为一个改进的选择?Java 8-11。

  • 问题内容: 我在寻找Python中的方法。 我想要做: 问题答案: 你可以使用in运算符:

  • 问题内容: 我想创建一个地图,可以将其转换为json对象,例如 但是golang指定使用类型声明地图,因此我可以使用map [string] string或map [string] int。我如何创建上述的json对象? 注意:直到运行时或需要创建json对象时,我才知道需要哪些数据和/或类型。因此,我不能只创建像 问题答案: 您可以随时使用存储任何类型。如包装袋中的文件所述: 若要将JSON解组