【问题标题】:Unable to put Class into a generic Map无法将 Class 放入通用 Map
【发布时间】:2020-12-06 10:13:59
【问题描述】:

以下是问题的示意图:

从视觉上可以看出,IDE 显示了一个编译时错误,它不允许将 class 插入到 Map 中。

这是一个简化版:

  @Override
  public <T extends Comparable> void transactPersistentEntityStore(...) {
    Map<Class<T>, ComparableBinding> propertyTypeMap = new HashMap<>();
    propertyTypeMap.put(EmbeddedArrayIterable.class, EmbeddedEntityBinding.BINDING);
    propertyTypeMap.put(EmbeddedEntityIterable.class, EmbeddedEntityBinding.BINDING);
    // ...
  }

即使EmbeddedArrayIterableEmbeddedEntityIterable 都实现了Comparable

我是否遗漏或误解了有关泛型的内容?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    你可以把问题的重点简化为这段代码sn -p:

    public <T extends Comparable> void m1(T x) {
      Class<? extends Comparable> x1Class = x.getClass();
      Class<T extends Comparable> x2Class = x.getClass();
    }
    

    甚至到这个:

    public <T> void m2(T x) {
      Class<?> x1Class = x.getClass();
      Class<T> x2Class = x.getClass();
    }
    

    变量x2Class的行在这些方法中有错误。 这是因为编译器丢弃了泛型,因此在运行时没有类型 T。 T 不可具体化。您无法在运行时获取类型 T。

    也可以看看这篇文章:Why following types are reifiable& non-reifiable in java?

    【讨论】:

    • 如果T 不起作用,我的示例代码中的propertyTypeMap 如何传递下去?
    • 您可以将地图的类型更改为Map&lt;Class&lt;? extends Comparable&gt;, ComparableBinding&gt;,或者您可以将类作为参数传递给函数transactPersistentEntityStore。看java.util.List的方法toArray,以第二种思路为例。
    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多