在Java中从Object转换而不获取未经检查的警告

swa*_*ohn 7 java generics casting

我写了一个有地图的类<String, Object>.我需要它来保存任意对象,但有时我需要投射一些这些对象,所以我会做类似的事情

HashMap<String, Object> map = new HashMap<String, Object>();                                                                                 
Object foo = map.get("bar");                                                                                                                                                                                                         
if (foo instanceof HashMap) {                                                                                                                                                                                                        
    ((HashMap<String, Integer>) foo).put("a", 5);                                                                                                                                                                                    
}            
Run Code Online (Sandbox Code Playgroud)

这给出了警告

Stuff.java:10: warning: [unchecked] unchecked cast
found   : java.lang.Object
required: java.util.HashMap<java.lang.String,java.lang.Integer>
        ((HashMap<String, Integer>) foo).put("a", 5);
Run Code Online (Sandbox Code Playgroud)

我怀疑它与泛型的使用有关.我可以使用@SupressWarnings("unchecked")摆脱错误,但我想知道是否有更好的方法来做到这一点.或许我得到警告的事实意味着我应该重新考虑我正在做的事情.有什么我可以做的,或者我应该只使用@SupressWarnings?

Chs*_*y76 4

编辑(基于问题澄清)

转换为HashMap<String, Integer>(顺便说一句,使用Map而不是HashMap可以说是更好的选择)是一个不同的故事。遗憾的是,在这种情况下,由于类型擦除,无法避免未经检查的警告。但是,您可以将其用作非通用地图:

if (foo instanceof Map) {                                                                                                                                                                                                        
  ((Map) foo).put("a", 5);                                                                                                                                                                                    
}
Run Code Online (Sandbox Code Playgroud)

显然,您必须使用“gets”,并且您会失去(感知的)类型安全性,但不会出现未经检查的警告。


这个故事一定还有更多内容。下面的代码:

Map<String, Object> map = Maps.newHashMap(); // or new HashMap<String, Object>();
Object foo = map.get("bar");
if (foo instanceof Widget) {
  ((Widget) foo).spin();
}
Run Code Online (Sandbox Code Playgroud)

不会为我生成未经检查警告。我也无法想象为什么会这样。如果您事先知道“bar”总是返回一个小部件,请执行以下操作:

Widget widget = (Widget) map.get("bar");
widget.spin();
Run Code Online (Sandbox Code Playgroud)

也会工作得很好。我在这里错过了什么吗?

  • 正在沿着这些思路输入一些东西。我怀疑 OP 正在传递或分配给原始 `Map` ,然后,当然,会生成未经检查的警告。 (2认同)