Java数组类型以及数组强制转型

知识总结

数组类与其它类一样,是Object的子类

@Test
void test() {
    int[] intArray = new int[5];
    System.out.println(Object.class.isAssignableFrom(int[].class));
    System.out.println(Object.class.isInstance(int[].class));
    System.out.println(intArray instanceof Object);
}

/* 
输出结果
true
true
true
*/

@Test
void test() {
    String[] stringArray = new String[5];
    System.out.println(Object.class.isAssignableFrom(String[].class));
    System.out.println(Object.class.isInstance(String[].class));
    System.out.println(stringArray instanceof Object);
}

/* 
输出结果
true
true
true
*/

不同的类对应数组类型也是独特的,不存在继承关系

@Test
void test() {
    System.out.println(HashMap[].class.isInstance(HashMap.class));
    System.out.println(HashMap.class.isInstance(HashMap[].class));
}

/*
输出结果
false
false
*/

数组类之间不存在继承关系

@Test
void test() {
    System.out.println(Object[].class.isInstance(String[].class));
    System.out.println(HashMap[].class.isInstance(LinkedHashMap[].class));
}

/*
输出结果
false
false
*/

数组类可根据对应的原始类继承关系转型

@Test
void test() {
    HashMap[] hashMapArray = new LinkedHashMap[5];
    LinkedHashMap[] linkedHashMapArray = (LinkedHashMap[])hashMapArray;
}

数组类根据对应的原始类继承关系向上转型后,不影响运行时的类型

@Test
void test() {
    HashMap[] hashMapArray = new LinkedHashMap[5];
    System.out.println(hashMapArray.getClass());
}
/*
输出结果
class [Ljava.util.LinkedHashMap;
*/

数组类根据对应的原始类继承关系向上转型后,也无法放入向上转型后对应的原始类的元素

@Test
void test() {
    HashMap[] hashMapArray = new LinkedHashMap[5];
    hashMapArray[0] = new LinkedHashMap();
    // 可通过编译,但会引起运行时异常
    hashMapArray[1] = new HashMap();
}

/*
java.lang.ArrayStoreException
*/

可放入子类元素

@Test
void test() {
    HashMap[] hashMapArray = new HashMap[5];
    hashMapArray[0] = new LinkedHashMap();
    hashMapArray[1] = new HashMap();
}

元素的类型不会改变数组的运行时类型

@Test
void test() {
    HashMap[] hashMapArray = new HashMap[2];
    hashMapArray[0] = new LinkedHashMap();
    hashMapArray[1] = new LinkedHashMap();
    System.out.println(hashMapArray.getClass());
}

/*
输出结果
class [Ljava.util.HashMap;
*/