Re: Another generics question: List<Class<?>> ls = ?
Mark Space wrote:
I got to thinking about the last generics question, and I don't
understand why the following doesn't work.
Given a list that holds some type of Class:
List<Class<String>> ls = new ArrayList<Class<String>>();
Why can't I assign this to a List that holds any type of Class?
List<Class<?>> al1 = ls; // oops
List<Class<?>> al2 = (List<Class<?>>) ls; // oops
Looking at the raw types, it seems this should work. al1 holds any type
of Class, and ls has a type of class. Yet there appears to be no way to
assign them. I don't know if this is a good idea, I merely want to
understand generics a little better.
For the same reason you can't do
List <Number> numbers = new ArrayList <Number> ();
List <Integer> integers = new ArrayList <Integer> ();
List <Number> noops = integers; // forbidden
List <Integer> ieeks = numbers; // forbidden
<http://java.sun.com/docs/books/tutorial/java/generics/subtyping.html>
Given 'Sub' extends 'Parent', it is not true that 'Foo<Sub>' extends
'Foo<Parent>'. If it did, it would allow illegal actions.
noops.add( 0, Long.valueOf( 1L ));
Integer ix = integers.get( 0 ); // how did a Long get in here?
numbers.add( 0, Long.valueOf( 1L ));
ix = ieeks.get( 0 ); // how did a Long get in here?
List<Class<String>> ls = new ArrayList<Class<String>>();
List<Class<?>> al1 = ls; // oops
List<Class<?>> al2 = (List<Class<?>>) ls; // oops
al1.add( 0, Long.class );
String name = ls.get( 0 ).newInstance();
// how did a Long get in here?
al2.add( 0, Long.class );
name = ls.get( 0 ).newInstance();
// how did a Long get in here?
--
Lew