有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java单个泛型参数同时接受两种不同的类型

在下面的场景中,我有一个方法,它接受2个类型为E的数组。我的理解是,这个E参数意味着这两个数组可以是任何类型,但它们必须是相同的(正如我从this问题派生的)。 我已经用两个数组(一个整数和一个双精度数组)对此进行了测试,但没有收到任何错误。我收到的输出是'14',这是两个数组的组合大小,没有引发任何错误

有人能解释一下为什么会这样吗

public static <E> void showCombinedLength(E[] array1, E[] array2){
    System.out.println(array1.length + array2.length);
}

public static void main(String[] args) {
    Integer[] integerArray = {1, 2, 3, 4, 5, 6, 7};
    Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
    PrintArray.showCombinedLength(integerArray, doubleArray);
}

输出:

14


共 (3) 个答案

  1. # 1 楼答案

    在方法定义中定义单个泛型类型时,只能将该方法与同一类型的两个数组一起使用

    然而,在java中,数组类型是协变的,因此Integer[]和Double[]都是Object[]的子类(它们也是Number[]的子类)。因此,您的代码将始终编译,并且不需要指定多个类型参数

  2. # 2 楼答案

    您的阵列都是对象的阵列。称之为

    PrintArray.<Integer>showCombinedLength(integerArray, doubleArray);
    

    编译器将拒绝编译

  3. # 3 楼答案

    泛型是在1.5版中引入Java的。由于向后兼容,Java字节码不知道某些方法是泛型的,而另一种不是。这就是为什么编译后,您的方法实际上是:

    public static void showCombinedLength(Object[] array1, Object[] array2)

    所有泛型类型实际上都更改为Object。所以Integer[]Double[]实际上都是具有length方法的对象数组。这就是该代码工作的原因