Java:将对象强制转换为泛型类型

2022-09-02 11:50:18

在 Java 中,当从对象强制转换为其他类型的时,为什么第二行会产生与强制转换相关的警告,而第一行则不会?

void a(Object o) {
  Integer i = (Integer) o;
  List<Integer> list = (List<Integer>) o;
}

/*Type safety: Unchecked cast from Object to List<Integer>*/

答案 1

这是因为由于类型擦除,在执行时不会真正检查对象是否为 a。它真的只是把它扔给.例如:List<Integer>List

List<String> strings = new ArrayList<String>();
strings.add("x");
Object o = strings;

// Warning, but will succeeed at execution time
List<Integer> integers = (List<Integer>) o;
Integer i = integers.get(0); // Bang!

有关详细信息,请参阅 Angelika Langer 的 Java Generics FAQ,尤其是类型擦除部分


答案 2

Jon的答案是正确的,但有时你无法绕过这个警告(就像你在使用遗留API时一样)。在这些情况下,您可以像这样禁止显示警告:

@SuppressWarnings("unchecked")
List<Integer> list = (List<Integer>) someApiThatReturnsNonGenericList();

推荐