提问人:Zhro 提问时间:9/23/2022 最后编辑:Zhro 更新时间:9/23/2022 访问量:331
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?
问:
我在这里收到一个警告,说 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);
答:
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 中的泛型可能非常烦人......Class
method(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>
评论
c
Class<Map> c = Map.class;