I don't understand why I get ClassCastException on below code in line:
for(int i = 0; i < k.t.length; i++)
So problem is that in method addElement I make replacing of array elements by objects with type T. In my opinion in array should be objects with type T. And compiler doesn't protest for that. 
But in run-time JVM cannot cast despite in array is really objects with type T (in case below String), why JVM cannot use polymorphism?
But when I change the  T[] t; to Object[] t;
and remove cast in constructor it run correctly without any errors, why?
public class MyCollection<T> {
    T[] t;
    MyCollection( int size){
        t = (T[]) new Object[size];
    }
    boolean addElement(T e, int i){        
        if(i < t.length){
            t[i] = e;
            return true;
        }
        return false;            
    }
    public static void main(String[] ss){
        MyCollection<String> k = new MyCollection<String>(3);
        k.addElement("a",0);
        k.addElement("b",1);
        k.addElement("c",2);
        for(int i = 0; i < k.t.length; i++)
            System.out.println(k.t[i]);     
        //for(String s : (String[])k.t)
        //    System.out.println(s);        
    }
}
 
     
     
     
    