The fact that a raw type of generic class can take all different variations of that generic class is matter of Java compatibility?
===

I noticed that a raw type of a generic class can take(point to) all different variations of the generic class and also all different variations of a generic class can take(point to) the raw type of the generic class. Why Java Generics behaves like that? Is it purely because of compatibility with the old versions of Java?

Example: 

    //Main.java
    public class Main {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    
    		List list1 = new ArrayList();
    		List<Student> list2 = new ArrayList<Student>();
    		List<?> list3 = new ArrayList<Student>();
    		List<? extends Student> list4 = new ArrayList<Student>();
    		List<? super Student> list5 = new ArrayList<Student>();
    
    		// List raw type can take all different variations of List
    		List rawList1 = list1;
    		List rawList2 = list2;
    		List rawList3 = list3;
    		List rawList4 = list4;
    		List rawList5 = list5;
    
    		// all different variations of List can take List raw type
    		list1 = rawList1;
    		list2 = rawList2;
    		list3 = rawList3;
    		list4 = rawList4;
    		list5 = rawList5;
    
    	}
    
    }
    
    //People.java
    public class People {
    
    	public static class Student extends People {
    	}
    
    	public class HistoryStudent extends Student {
    	}
    
    	public class MathStudent extends Student {
    	}
    }

