0

在以下场景中,我有一个接受 2 个 E 型数组的方法。我的理解是,这个 E 参数意味着两个数组都可以是任何类型,但它们必须相同(正如我从这个问题中得出的那样)。我已经用两个数组进行了测试,一个整数和一个双精度,但我没有收到任何错误。我收到的输出是“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

4

3 回答 3

4

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

但是,在 java 中,数组类型是协变的,因此 Integer[] 和 Double[] 都是 Object[] 的子类(它们也是 Number[] 的子类)。所以你的代码会一直编译,不需要指定多个类型参数。

于 2013-01-06T14:47:25.877 回答
2

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

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

并且编译器将拒绝编译。

于 2013-01-06T14:45:39.117 回答
-1

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

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

所有泛型类型都真正更改为Object. 所以两者Integer[]都是具有方法Double[]的对象数组。length这就是此代码有效的原因。

于 2013-01-06T14:46:23.793 回答