.NET has reified generics; Java has erased generics.
The difference is this: if you have an List<String>ArrayList<String> object, in .NET, you can tell (at runtime) that the object has type List<String>ArrayList<String>, whereas in Java, at runtime, the object is of type ArrayList; the String part is lost. If you put in non-String objects into the ArrayList, the system can't enforce that, and you'll only know about it after you try to extract the item out, and the cast fails.