gpt4 book ai didi

java - 是否可以将通用参数发送到 Map?

转载 作者:行者123 更新时间:2023-11-30 11:50:39 25 4
gpt4 key购买 nike

也许标题措辞不当,有更好知识的人可以编辑它。

我想创建一个方法 parseFromJSONMap它使用 gson 解析 JSON 文件并将数据作为 Map 返回,更具体地说是 Map<String, T>其中 T 是名为 Entity 的类的子类.到目前为止定义了两个子类,CreatureHero但以后可能会有更多。所以如果我调用

parseFromJSONMap(file, Creature.class)

它应该返回 Map<String, Creature>如果我调用

parseFromJSONMap(file, Hero.class)

它应该返回 Map<String, Hero>

这是该方法现在的样子(它只适用于生物):

public static <T extends Entity> Map<String, T> parseFromJSONMap(File file, Class<T> clazz) throws FileNotFoundException
{
Type type = new TypeToken<HashMap<String, Creature>>(){}.getType();
return gson.fromJson(new FileReader(file), type);
}

所以不是 Creature , 我想把 T .如果我这样做并这样调用它

Map<String, Creature> test = Entity.parseFromJSONMap(somefile, Creature.class); 

我得到 java.lang.Object cannot be cast to heroes.model.Creature

我想要的是可能的吗?

编辑:当我在 test 上调用任何方法时发生异常,例如 test.get("someCreature") ,所以这是一个运行时异常。

最佳答案

你是说你这样做是为了让它爆炸吗?

public static <T extends Entity> Map<String, T> parseFromJSONMap(File file, Class<T> clazz) throws FileNotFoundException
{
Type type = new TypeToken<HashMap<String, T>>(){}.getType();
return gson.fromJson(new FileReader(file), type);
}

你的问题是你需要在创建 TypeToken 时使类型参数具体化,否则它怎么知道它应该代表什么类型?请记住删除是 replacing type parameters by their leftmost bound那一个super type token (这就是 TypeToken 的含义,在 Guice & Gson 和其他各种地方使用)基本上是一个技巧,可以让您通过反射访问父类(super class)的参数化类型信息。还要注意 javadoc 说

This syntax cannot be used to create type literals that have wildcard parameters, such as Class<?> or List<? extends> CharSequence>.

这基本上就是你的情况。我知道的唯一出路是以编程方式创建类型 token 。例如通过 Method.getGenericReturnType或者通过查看 Guice 使用类型标记的方式,乍一看它有一组更丰富的实用方法来解决这些问题。如何执行此操作的示例在 this question 中。 ,这使用了一些 guice 类,但如果您查看 guice 源代码,它应该变得相当明显。

关于java - 是否可以将通用参数发送到 Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868565/

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