如果您处于这种情况,您有两种选择。首先是进行未经检查的演员表:
Object o = getObjectFromSomewhereMysterious();
List<String> lst = (List<String>)o; //compiler warning
这将导致您提到的警告-这意味着,由于类型擦除,在运行时强制转换只能检查以确保o是 a List,而不是 a List<String>。因此,例如 if ois 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允许持有Strings。我们能做的最好的就是从中读取,但即便如此,元素也只能输入为Object:
Object element = lst.get(0);