Map 是分配 Map.class 时的原始类型。但是分配类型会导致不匹配。如何参数化 Map.class?

Map is a raw type when assigning Map.class. But assigning a type results in a mismatch. How do I parameterize Map.class?

提问人:Zhro 提问时间:9/23/2022 最后编辑:Zhro 更新时间:9/23/2022 访问量:331

问:

我在这里收到一个警告,说 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);
Java 泛型原始 类型

评论

1赞 Sweeper 9/23/2022
你想做什么?根据这一点,可以安全地将其保留为 .cClass<Map> c = Map.class;
0赞 Zhro 9/23/2022
我在我的用例中添加了一些进一步的说明。它应该是安全的,但我想知道是否有办法在不抑制警告的情况下满足编译器的要求。

答:

0赞 knittl 9/23/2022 #1

Map.class是 的 ,而 不是 。你可以使用 ,因为 every 也是一个(但不是相反)Class<Map>Class<Map<Object, Object>Class<? super Map<Object, Object>> c = Map.class;Map<Object, Object>Map

评论

0赞 Zhro 9/23/2022
这确实回答了我关于如何在没有任何警告的情况下执行赋值的问题部分,但不是方法调用。我以为将警告作为表达式的一部分来解决会通过消息调用来满足警告,但它仍然抱怨类型不匹配: .Type mismatch: cannot convert from capture#1-of ? super Map<Object,Object> to Map<Object,Object>
0赞 knittl 9/23/2022
@Zhro您的其他方法也需要更改为协变/逆变,以便它可以处理类型参数不完全匹配的泛型类型。或者,您将更改方法以使用原始 .所以可能或.如果没有,您给定的方法已经有效。Java 中的泛型可能非常烦人......Classmethod(Class<? extends T> type)method(Class<? super T> type)otherMethod
0赞 Tim Moore 9/23/2022 #2

这将禁止在呼叫站点发出警告:

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

表达式上仍然有一个未经检查的投射警告,但我认为这是不可避免的。(T) otherMethod(type)

评论

0赞 Zhro 9/23/2022
此警告的来源来自 SnakeYAML。他们已经在他们这边压制了这个警告,但使用 .这是他们公共界面的疏忽,还是我使用他们图书馆的问题?bitbucket.org/snakeyaml/snakeyaml/src/......Class<T>
0赞 Tim Moore 9/23/2022
我不使用图书馆,所以我真的不能说。在简要查看了文档之后,他们似乎打算将该方法用于 JavaBeans 而不是集合。loadAs