单个通用参数同时接受两种不同的类型

时间:2013-01-06 14:42:48

标签: java generics parameters

在下面的场景中,我有一个接受2个Type E数组的方法。我的理解是这个E参数意味着两个数组都可以是任何类型,但它们必须相同(因为我从{{派生') 3}}问题)。 我用两个数组,一个Integer和一个Double测试了这个,但是我没有收到任何错误。我收到的输出是'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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您的数组都是对象数组。用

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

并且编译器将拒绝编译。

答案 2 :(得分:-1)

在1.5版本中将泛型引入Java。由于向后兼容性,Java字节代码不知道某些方法是通用的而另一种方法不是。这就是为什么在编译后你的方法确实是:

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

所有通用类型实际上已更改为Object。因此,Integer[]Double[]都是具有length方法的对象数组。这就是这段代码有效的原因。

相关问题