我想知道是否有一种方法可以将SuperType
数组转换为SubType
数组。像这样:
SubType[] subArray = (SubType[])someSuperTypeArray;
我知道在运行时会抛出ClassCastException
。转换数组的方法是将其复制到另一个数组中。就我而言,复制它不是一种选择。
我可以欺骗JVM,让人相信演员表是有效的,并绕过类类型检查吗?创建对SuperType
数组的引用,通过该引用将其视为某个SubType
数组。 (可能面临无法解释的错误的危险)
答案 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
只能指向两个可能的数组实例。
SuperType someSuperTypeArray = new SuperType[10];
:您可以向此阵列添加SuperType
个对象或SubType
个对象SuperType someSuperTypeArray = new SubType[10];
:您只能将SubType
个对象添加到此数组中。 (从技术上讲,您可以在编译时将SuperType
个对象添加到此数组中,但这会在运行时生成ArrayStoreException
让我们假设在第一种情况下,您确实设法欺骗JVM,允许您将someSuperTypeArray
引用转换为SubType[]
引用。如果someSuperTypeArray
的元素类型为SuperType
,应该怎么办?您无法真正期望演员表隐式丢弃所有SuperType
元素。
在第2种情况下,如果您想要做的就是将引用转换为SuperType[]
引用,那么对SubType[]
数组实例使用SubType[]
引用是否有任何意义。首先使用SubType[]
引用。