What happens if we say
List ls4=ls1;
ls1 is of type Integer. After assigning it to ls4 , ls4 is able to hold both String and Integer. And also we are able to assign ls5=ls4.
When you use raw types you don't have any sort of compile time type safety (which is what generics provides.) When you assign l1 to l4 that's not a problem, but when you add anything to l4 you will get a compiler warning which mentions unsafe operations.
All code in my posts, unless a source is explicitly mentioned, is my own.