Java 如何以及何时将变量强制转换为泛型类型参数中声明的类型?
另一个有趣的事实是,尽管Java 如何以及何时将变量强制转换为泛型类型参数中声明的类型?,java,generics,Java,Generics,另一个有趣的事实是,尽管ArrayList的元素存储在Object[]数组中,但它们在返回方法get()之前总是转换为type参数中定义的类型: 因此,如果有人可以向我指出文档中逐步解释了这些问题,我将非常感谢编译器在需要强制转换时插入强制转换。方法System.out.println有一个类型为Object的参数,因此不需要转换为Integer 对于三个print方法,将选择参数类型为Integer的方法,因此编译器将插入强制转换。根据一组复杂的规则,在编译时选择使用这三种方法中的哪一种。这些
ArrayList
的元素存储在Object[]
数组中,但它们在返回方法get()
之前总是转换为type参数中定义的类型:
因此,如果有人可以向我指出文档中逐步解释了这些问题,我将非常感谢编译器在需要强制转换时插入强制转换。方法
System.out.println
有一个类型为Object
的参数,因此不需要转换为Integer
对于三个print
方法,将选择参数类型为Integer
的方法,因此编译器将插入强制转换。根据一组复杂的规则,在编译时选择使用这三种方法中的哪一种。这些规则使用常规信息查看integers.get(1)
具有类型Integer
,因此选择Integer
版本,并且需要强制转换。因此,该代码或多或少相当于Java4
code
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
E elementData(int index) {
return (E) elementData[index];
}
在问题的最后一部分中,对(E)
的转换实际上在运行时不会执行任何操作,因此不会抛出ClassCastException
。只需要让代码编译就可以了。您告诉编译器,是的,您确信对象
实际上是一个E
,并且不会在以后导致异常(尽管您通过混合原始类型和泛型类型破坏了这一点)
public static void main(String[] args) {
List<Integer> integers = new ArrayList<>();
integers.add(5); //element #0
List list = integers;
list.add("foo"); //element #1
print(integers.get(1));
}
private static void print(Object var) {
System.out.println(var);
}
//this method is entered
private static void print(Integer var) {
System.out.println(var);
}
private static void print(String var) {
System.out.println(var);
}
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
E elementData(int index) {
return (E) elementData[index];
}
List integers = new ArrayList();
integers.add("foo");
integers.add(Integer.valueOf(5)); // No autoboxing in Java 4!
print((Integer) integers.get(1)); // Cast inserted by compiler