【问题标题】:How to pass a Class<Descendant> into a Hashmap?如何将 Class<Descendant> 传递给 Hashmap?
【发布时间】:2019-05-30 12:00:52
【问题描述】:

我正在使用类型对填充 HashMap 对象 &lt;String, Class&lt;Ancestor&gt;&gt;,其中Ancestor 是一些自定义类。背后的想法是用微服务名称实例化一个对象。

我在这样输入时遇到编译错误:

已编辑

map.put("some label", Descendant.class);

很明显HashMap 类需要一个真正的Ancestor 类,而不是任何扩展AncestorDescendant 类。

由于我有几十个不同的后代类(微服务),有人能告诉我如何使用 HashMap 避免这种限制吗?

我尝试在 HashMap 声明中使用 Class&lt;?&gt; 而不是 Class&lt;Ancestor&gt;。但是在调用微服务时,Eclipse 会触发强制转换警告

Class<Ancestor> a = (Class<Ancestor>) map.get("some label");

奇怪的警告说:

Type safety: unchecked cast from Class <capture#151-of ?> to Class <Ancestor>

【问题讨论】:

  • 对于该警告,请提供完整的minimal reproducible example。就像声明该映射的简单方法一样,添加一个值并检索它。
  • 这是 Ecilpse IDE 在编辑时的警告。我可以在 Eclipse 中使警告静音,但我更喜欢更清洁的解决方案。
  • 我知道警告。但同样:请认真阅读minimal reproducible example 并相应地增强您的问题。你展示了一小部分代码,但这为你的代码中没有显示的东西留下了一个开放的空间。

标签: java inheritance casting hashmap


【解决方案1】:

您可以尝试使用HashMap&lt;String, Class&lt;? extends Ancestor&gt;&gt; 使Class 的通用参数协变。

你不应该把Classgetmap转换成Class&lt;Ancestor&gt;,把它当作Class&lt;? extends Ancestor&gt;来使用:

Class<? extends Ancestor> clazz = map.get("...");

【讨论】:

  • 太棒了!谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 2011-09-23
  • 2017-07-05
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多