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?
编辑(基于问题澄清)
转换为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)
也会工作得很好。我在这里错过了什么吗?
| 归档时间: |
|
| 查看次数: |
26160 次 |
| 最近记录: |