将JVM强制转换为强制转换数组

时间:2015-07-05 12:59:17

标签: java arrays casting

我想知道是否有一种方法可以将SuperType数组转换为SubType数组。像这样:

SubType[] subArray = (SubType[])someSuperTypeArray;

我知道在运行时会抛出ClassCastException。转换数组的方法是将其复制到另一个数组中。就我而言,复制它不是一种选择。

我可以欺骗JVM,让人相信演员表是有效的,并绕过类类型检查吗?创建对SuperType数组的引用,通过该引用将其视为某个SubType数组。 (可能面临无法解释的错误的危险)

2 个答案:

答案 0 :(得分:3)

如果您将数组定义为

SuperType[] array = {element1, element2};
SubType[] array2 = (SubType[]) array;

它不起作用,但你可以这样做:

SuperType[] array = new SubType[]{element1, element2};
SubType[] array2 = (SubType[]) array;

您必须确保字段array在您投射时始终必须是您的SubType数组。

答案 1 :(得分:1)

someSuperTypeArray只能指向两个可能的数组实例。

  1. SuperType someSuperTypeArray = new SuperType[10];:您可以向此阵列添加SuperType个对象或SubType个对象
  2. SuperType someSuperTypeArray = new SubType[10];:您只能将SubType个对象添加到此数组中。 (从技术上讲,您可以在编译时将SuperType个对象添加到此数组中,但这会在运行时生成ArrayStoreException
  3. 让我们假设在第一种情况下,您确实设法欺骗JVM,允许您将someSuperTypeArray引用转换为SubType[]引用。如果someSuperTypeArray的元素类型为SuperType,应该怎么办?您无法真正期望演员表隐式丢弃所有SuperType元素。

    在第2种情况下,如果您想要做的就是将引用转换为SuperType[]引用,那么对SubType[]数组实例使用SubType[]引用是否有任何意义。首先使用SubType[]引用。