如果您处于这种情况,您有两种选择。首先是进行未经检查的演员表:
Object o = getObjectFromSomewhereMysterious();
List<String> lst = (List<String>)o; //compiler warning
这将导致您提到的警告-这意味着,由于类型擦除,在运行时强制转换只能检查以确保o
是 a List
,而不是 a List<String>
。因此,例如 if o
is a强制转换HashMap
将立即失败,但如果它是 aList<Integer>
它不会失败......直到稍后您尝试处理lst
类似 a的元素String
。这被称为“污染堆”:
//some later place in the code path - who knows, it could be miles away
String str = lst.get(0); //ClassCastException if lst isn't really a List<String>
只要您可以确定强制转换是安全的,您就可以抑制编译器警告:
@SuppressWarnings("unchecked") //this is safe because blah blah blah
List<String> lst = (List<String>)o;
始终记录为什么可以抑制警告 - 这有助于保持代码的可维护性。
第二种选择是安全的:
List<?> lst = (List<?>)o;
这意味着lst
是List
某种未知类型。它允许您避免未经检查的演员表,但限制了您可以做什么lst
:
lst.add("some string"); //compiler error
该声明是非法的,因为我们不知道是否lst
允许持有String
s。我们能做的最好的就是从中读取,但即便如此,元素也只能输入为Object
:
Object element = lst.get(0);