【问题标题】:Map is a raw type when assigning Map.class. But assigning a type results in a mismatch. How do I parameterize Map.class?Map 在分配 Map.class 时是原始类型。但是分配类型会导致不匹配。如何参数化 Map.class?
【发布时间】:2022-09-23 14:36:22
【问题描述】:

我在这里收到警告,说 Map 是原始类型。

// Map is a raw type. References to generic type Map<K,V> should be parameterized
Class<Map> c = Map.class;

但是如果我参数化类型,那么我会得到一个不匹配的结果:

// Type mismatch: cannot convert from Class<Map> to Class<Map<Object,Object>>
Class<Map<Object, Object>> c = Map.class;

我尝试了一些变体,但我找不到任何方法来参数化表达式的右侧 (Map.class) 以满足已参数化的左侧。

在这种情况下如何参数化Map.class

在这种情况下,我将它传递给带有签名的方法:

public <T> T method(Class<T> type) {
   return (T) otherMethod(type);
}

我只想提供Map 类型,因为我不知道内部使用的是哪种地图,这个细节并不重要。我正在尝试解决调用该方法时收到的警告:

// Type safety: The expression of type Map needs unchecked conversion to conform to Map<String,Object>
Map<String, Object> a = method(Map.class);
  • 你想用c 做什么?取决于此,将其保留为Class&lt;Map&gt; c = Map.class; 是安全的。
  • 我为我的用例添加了一些进一步的说明。它应该是安全的,但我想知道是否有一种方法可以满足编译器而不必抑制警告。

标签: java generics raw-types


【解决方案1】:

Map.class 属于Class&lt;Map&gt;,而不是Class&lt;Map&lt;Object, Object&gt;。您可以使用Class&lt;? super Map&lt;Object, Object&gt;&gt; c = Map.class;,因为每个Map&lt;Object, Object&gt; 也是Map(但不是相反)

【讨论】:

  • 这确实回答了我关于如何在没有任何警告的情况下执行分配的问题,但不是方法调用。我认为将警告作为表达式的一部分解决会满足消息调用的警告,但它仍然抱怨类型不匹配:Type mismatch: cannot convert from capture#1-of ? super Map&lt;Object,Object&gt; to Map&lt;Object,Object&gt;
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 2016-06-14
  • 2021-08-29
  • 2021-10-02
  • 2021-11-13
  • 2021-07-28
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多