I've got the following code:
public class GenericsTest<T> {
        private T[] array1;
        private String[] array2;
        public GenericsTest() {
            array1 = (T[]) new Object[10];
            array2 = (String[]) new Object[10];
        }
        public T[] getArray1() {
            return array1;
        }
        public void setArray1(T[] array1) {
            this.array1 = array1;
        }
        public String[] getArray2() {
            return array2;
        }
        public void setArray2(String[] array2) {
            this.array2 = array2;
        }
        public static void main(String[] args) {
            new GenericsTest<String>();
        }
    }
Code crushes at line:
array2 = (String[]) new Object[10];
But it works fine with:
array1 = (T[]) new Object[10];
As you can see in main() method, T is a String. So I guess compiler will change T to String in
private T[] array1;
and array1 = (T[]) new Object[10] 
will be translated to 
array1 = (String[]) new Object[10]
So why 
array2 = (String[]) new Object[10] 
fails and (T[]) new Object[10]
doesn't?
 
     
    