Added a heuristic to assign correct types to cases in which the same variable is used both as an object array and as a primitive array:

a = null;
l1: a = new int[]
x = a[0]
print(x)
...
l2: a = new Object[]
...

In this case, a can only be of type "java.lang.Object". Though this is not an array type, we can cast it to the correct array type (int[] or Object[]) and then access its contents. This also influences the type of the variables used to store the results of array accesses ("x" in the example)