Учу понемногу Java и напоролся на такое:
public class Main {
    public static class MyTestClass<T>{
        private T[] myAr;
        private int curItem=0;
        private int count=10;
        MyTestClass(){
            myAr = (T[]) new Object[count]; //Этот код работает
            for(int i=0; i<myAr.length; i++){
                myAr[i] = (T) new Object(); //Этот код работает
            }
        }
        void set(T value){
            if(curItem<count) {
                myAr[curItem++] = value;
            }
        }
        T get(int index){
            return myAr[index];
        }
    }
    public static void main(String[] args){
        MyTestClass<Integer> myTestClass = new MyTestClass<Integer>();
        myTestClass.set(12);
        System.out.println(myTestClass.get(0));
        String[] str = (String[]) new Object[10]; //Этот код не работает, хотя, как мне кажется, делает тоже самое
    }
}
Внимание, вопрос!
myAr = (T[]) new Object[count];
...
myAr[i] = (T) new Object();
Почему это работает? Почему он может скастовать Object до дочерних классов внутри обобщенных классов? хотя при явном указании типов как здесь:
 String[] str = (String[]) new Object[10];




