I have the following generic test class:
public class BrokenGenerics<T> {
    private T[] genericTypeArray;
    public BrokenGenerics(T... initArray) {
        genericTypeArray = initArray;
    }
    public void setArray(T[] newArray) {
        genericTypeArray = newArray;
    }
    public T get(int idx) {
        return genericTypeArray[idx];
    }
    public Class getType() {
        return genericTypeArray.getClass().getComponentType();
    }
    public static boolean breakThis(BrokenGenerics any) {
        any.setArray(new B[]{new B(2)});
        return false;
    }
    public static void main(String[] args) {
        BrokenGenerics<A> aBreaker = new BrokenGenerics<A>(new A("1"));
        System.out.println(aBreaker.get(0));
        System.out.println(aBreaker.getType());
        breakThis(aBreaker);
        System.out.println(aBreaker.get(0));
        System.out.println(aBreaker.getType());
    }
    private static class A {
        public String val;
        public A(String init) {
            val = init;
        }
        @Override
        public String toString() {
            return "A value: " + val;
        }
    }
    private static class B {
        public int val;
        public B(int init) {
            val = init;
        }
        @Override
        public String toString() {
            return "B value: " + val;
        }
    }
}
When I run it, I get this output, and no errors:
A value: 1
class BrokenGenerics$A
B value: 2
class BrokenGenerics$B
Now, I understand why this compiles; it can't know at compile-time that breakThis is being passed a generic of a bad type. However, once it runs the line any.setArray(new B[]{new B(2)});, shouldn't it throw a ClassCastException (NOTE THAT IT DOES NOT! Try it yourself!) because I'm trying to pass a B[] to a method that expects an A[]? And after that, why does it allow me to get() back the B?
 
     
     
    