先说结论:
- 基元类型数组不允许协变和逆变,无法编译通过。
- 引用类型数组允许协变和逆变,逆变时会检查实际类型,如果不相符则抛出java.lang.ClassCastException。
下面是验证代码。
1 1 public class TestArrayInstance { 2 2 public static void main( 3 3 String[] args 4 4 ) { 5 5 char[] a1 = {'1', '2', '3'}; 6 6 int[] a2 = {1, 2, 3}; 7 7 long[] a3 = {1L, 2L, 3L}; 8 8 float[] a4 = {1.0F, 2.0F, 3.0F}; 9 9 double[] a5 = {1.0, 2.0, 3.0}; 1010 Integer[] a6 = {1, 2, 3}; 1111 Long[] a7 = {1L, 2L, 3L}; 1212 1313 String[] a8 = {"1", "2", "3"}; 1414 Object[] a9 = {"1", 2L, 3}; 1515 1616 printCheck(a1, Character[].class); 1717 printCheck(a1, Object[].class); 1818 printCheck(a2, Integer[].class); 1919 printCheck(a2, Object[].class); 2020 printCheck(a2, Long[].class); 2121 printCheck(a2, long[].class); 2222 printCheck(a3, Long[].class); 2323 printCheck(a3, double[].class); 2424 printCheck(a4, Float[].class); 2525 printCheck(a4, Double[].class); 2626 printCheck(a4, double[].class); 2727 printCheck(a5, Double[].class); 2828 printCheck(a6, Long[].class); 2929 printCheck(a6, int[].class); 3030 printCheck(a6, long[].class); 3131 printCheck(a7, Double[].class); 3232 printCheck(a7, long[].class); 3333 printCheck(a7, int[].class); 3434 printCheck(a8, Object[].class); 3535 printCheck(a9, String[].class); 3636 } 3737 3838 private static void printCheck( 3939 Object v, 4040 Class<?> c 4141 ) { 4242 System.out.println(paddingClassName(v.getClass()) + " instanceof " + paddingClassName(c) + (c.isInstance(v) ? " true" : " false")); 4343 } 4444 4545 private static String paddingClassName( 4646 Class<?> c 4747 ) { 4848 return (c.getSimpleName() + " ").substring(0, 12); 4949 } 5050 }
执行结果:
1char[] instanceof Character[] false 2char[] instanceof Object[] false 3int[] instanceof Integer[] false 4int[] instanceof Object[] false 5int[] instanceof Long[] false 6int[] instanceof long[] false 7long[] instanceof Long[] false 8long[] instanceof double[] false 9float[] instanceof Float[] false 10float[] instanceof Double[] false 11float[] instanceof double[] false 12double[] instanceof Double[] false 13Integer[] instanceof Long[] false 14Integer[] instanceof int[] false 15Integer[] instanceof long[] false 16Long[] instanceof Double[] false 17Long[] instanceof long[] false 18Long[] instanceof int[] false 19String[] instanceof Object[] true 20Object[] instanceof String[] false