Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以及何时将变量强制转换为泛型类型参数中声明的类型?_Java_Generics - Fatal编程技术网

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